我无法解决这个问题。需要找到重复的,我做到了。现在剩下的就是打印重复项出现在阵列中的次数。我刚开始使用Java,因此需要对其进行硬编码才能理解。花最后两天试图弄清楚,但是没有运气。任何帮助都会很棒!谈话很便宜,这是代码。.
import java.util.Arrays;
public class LoopTest {
public static void main(String[] args) {
int[] array = {12,23,-22,0,43,545,-4,-55,43,12,0,-999,-87};
int positive_counter = 0;
int negative_counter = 0;
for (int i = 0; i < array.length; i++) {
if(array[i] > 0) {
positive_counter++;
} else if(array[i] < 0) {
negative_counter++;
}
}
int[] positive_array = new int[positive_counter];
int[] negative_array = new int[negative_counter];
positive_counter = 0;
negative_counter = 0;
for (int i = 0; i < array.length; i++) {
if(array[i] > 0) {
positive_array[positive_counter++] = array[i];
} else if(array[i] < 0) {
negative_array[negative_counter++] = array[i];
}
}
System.out.println("Positive array: " + (Arrays.toString(positive_array)));
System.out.println("Negative array: " + (Arrays.toString(negative_array)));
Arrays.sort(array);
System.out.println("Array duplicates: ");
for (int i = 0; i < array.length; i++) {
for (int j = i + 1; j < array.length; j++) {
if(array[i] == array[j]) {
System.out.println(array[j]);
}
}
}
}
}
答案 0 :(得分:2)
由于您已经在对数组进行排序,因此只需一个循环即可找到重复项(它们会紧挨着吗?)。因此,您可以执行以下操作:
Arrays.sort(array);
System.out.println("Array duplicates: ");
int lastValueCount=1; //How many times we met the current value (at least 1 - this time)
for (int i = 1; i < array.length; i++){
if(array[i] == array[i-1])
lastValueCount++; //If it is the same as the previous increase the count
else {
if(lastValueCount>1) //If it is duplicate print it
System.out.println(array[i-1]+" was found "+lastValueCount+" times");
lastValueCount=1; //reset the counter
}
}
您的数组的结果是:
Array duplicates:
0 was found 2 times
12 was found 2 times
43 was found 2 times
此外,您还可以使用一些Java技巧,例如将值插入Map或类似的东西,但是我想您是从算法的角度来看的,因此以上只是一个循环的简单答案
答案 1 :(得分:1)
只需遍历您的解决方案,首先将正数和负数分成两个不同的数组,然后再也不使用它们,那么这种分离的目的是什么? 我只是给您一个与您的问题有关的想法,最好自行解决,以便可以使用Java。
解决方案:您可以使用Dictionary-key值对。遍历数组,将Dictionary中的元素作为键,值设置为零,在每次迭代中检查该键是否已存在于Dictionary中,只需增加其值即可。最后,所有值都是数组中重复的值。
希望它对您有帮助。
答案 2 :(得分:1)
从算法的角度来看,Veselin Davidov的答案很好(最有效)。
在生产代码中,您宁愿这样写:
Map<Integer, Long> result =
Arrays.stream(array)
.boxed() //converts IntStream to Stream<Int>
.collect(Collectors.groupingBy(i -> i, Collectors.counting()));
结果是这张地图:
System.out.println(result);
{0 = 2,545 = 1,-4 = 1,-22 = 1,-87 = 1,-999 = 1,-55 = 1,23 = 1,43 = 2,12 = 2} < / p>
答案 3 :(得分:0)
一种简单的方法是使用地图。无需过多更改代码:
for (int i = 0; i < array.length; i++) {
int count = 0;
for (int j = i + 1; j < array.length; j++) {
if(array[i] == array[j]) {
System.out.println(array[j]);
count++;
}
}
map.put(array[i], count);
}
文档: https://docs.oracle.com/javase/7/docs/api/java/util/Map.html
编辑:作为推荐,在完成示例后,您应该对代码进行分析,找到不需要的内容,可以做的更好的事情,等等。
所有辅助阵列都是必需的吗?所有循环都是必需的吗?
答案 4 :(得分:0)
您可以通过为重复值创建一个数组列表来做到这一点:-
Arrays.sort(array);
System.out.println("Array duplicates: ");
ArrayList<Integer> duplicates = new ArrayList<Integer>();
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
if(j != i && array[i] == array[j] && !duplicates.contains(array[i])){
duplicates.add(array[i]);
System.Out.println(duplicates[duplicates.size()-1]);
}
}
}
答案 5 :(得分:0)
公共静态无效的findDuplicate(String s){
char[] charArray=s.toCharArray();
ArrayList<Character> duplicateList = new ArrayList<>();
System.out.println(Arrays.toString(charArray));
for(int i=0 ; i<=charArray.length-1; i++){
if(duplicateList.contains(charArray[i]))
continue;
for(int j=0 ; j<=charArray.length-1; j++){
if(i==j)
continue;
if(charArray[i] == charArray[j]){
duplicateList.add(charArray[j]);
System.out.println("Dupliate at "+i+" and "+j);
}
}
}
}