按模式,我正在检查数组是否有重复项。我在此处查看了类似的问题,但他们使用包含ArrayList
和HashMap
的答案解决了问题。我不熟悉它们并试图用数组来回答它。我的以下代码仅适用于1个重复,无法执行多个重复检测。
public class Mode {
public static void main(String[] args) {
int[] num = {2,3,4,5,8,8,8,7,7,7};
int mode = mode(num);
System.out.println(mode);
}
public static int mode(int[] num){
for(int x=0; x < num.length; x++){
for(int y=x+1; y < num.length; y++){
if(num[x] == num[y]){
return num[x];
}
}
}
return num[0];
}
}
答案 0 :(得分:1)
方法mode
应该返回包含重复项而不是int
的{{3}}。另请注意,内部循环不正确。你应该这样做:
public static HashSet<Integer> mode(int[] num){
HashSet<Integer> dup = new HashSet<>();
for(int x=0; x < num.length; x++) {
for(int y=0; y < num.length; y++) {
if(num[x] == num[y] && x != y) {
dup.add(num[x]);
}
}
}
return dup;
}
该溶液为O(n 2 )。如果您:
,您可以获得更好的解决方案num[i] == num[i + 1]
,那就是重复。此解决方案为O(n * log(n)) - 仅对阵列进行一次排序和传输。
答案 1 :(得分:0)
如果您需要所有重复项的列表,此代码将为您提供答案。如果您只想要重复的数字,请使用@Stefan中的代码。
import java.util.Arrays;
public class Mode {
public static void main(String[] args) {
int[] num = {2, 3, 4, 5, 8, 8, 8, 7, 7, 7};
int[] mode = mode(num);
int i;
System.out.print("The duplicates are: ");
for (i = 0; i < mode.length - 1; i++) {
System.out.print(mode[i] + ", ");
}
System.out.println(mode[i] + ".");
}
public static int[] mode(int[] num) {
int numberOfDuplicates = 0;
int[] duplicates = new int[num.length];
Arrays.sort(num);
for (int i = 1; i < num.length; i++) {
if (num[i - 1] == num[i]) {
duplicates[numberOfDuplicates++] = num[i];
}
}
return Arrays.copyOf(duplicates, numberOfDuplicates);
}
}
答案 2 :(得分:-1)
第一个声明是INCORRECT。一定是
for (int x=0; x < num.length - 1; x++) //--- You used x < num.length
源代码如下所示
Set<Integer> result = new HashSet<Integer>();
for(int x=0; x < num.length - 1; x++) {
boolean duplicated = false;
for(int y=x+1; y < num.length; y++) {
if(num[x] == num[y]) {
duplicated = true;
break;
}
}
if (duplicated) result.add(num[x]);
}
return result;