我一直在尝试编写代码来查找排序数组中的唯一值,该数组也有重复项。
到目前为止,我已经写了:
public static int numUnique (double[] list) {
int counter = 0;
if (Array.getLength(list) < 1) {
return Length.list);
}
else{
for (int i=0; i < Length.list); i++){
for (int j=i+1; j< Length.list); j++){
if (list[i] != list[j]){
newrArray[i] = list[i];
counter++;
}
}
}
}
return counter;
}
输入:
{31, 31, 31, 31, 33, 46, 46, 46, 46, 46, 52, 65, 65, 66, 75, 98, 98}
预期输出:
8
我不能使用 HashSet
或 ArrayList
。我认为唯一可行的选择是从一个数组复制到另一个数组,然后计算新数组中的内容(假设只有唯一值被复制到新数组中)。
最佳答案
你知道这个数组中的最大值吗?如果它足够小,您可以创建一个该大小的 boolean 数组,如果在原始数组中找到该值,则将该值设置为 true。
这叫做 counting sort .
例子:
boolean[] found = new boolean[max];
for(int i : list)
found[i] = true;
int unique = 0;
for(int i = 0; i < found; i++)
if(found[i]) unique++;
如果没有,计算唯一元素的个数并插入。
public int uniqueAmount(double[] list) {
double last = Double.NaN;
int unique = 0;
for(int i = 0; i < list.length; i++)
if(last != (last = list[i]))
unique++;
return unique;
}
public double[] uniqueValues(double[] list) {
int unique = uniqueAmount(list);
double[] found = new double[unique];
double last = Double.NaN;
last = list[0];
found[0] = last;
for(int i = 0, index = 1; i < list.length; i++)
if(last != list[i]) {
found[index++] = list[i];
last = list[i];
}
return found;
}
测试成功。
如果调用 uniqueAmount
则返回 8,如果调用 uniqueValues
则返回数组 [31.0, 33.0, 46.0, 52.0, 65.0, 66.0, 75.0, 98.0]
>(根据您的编辑要求)。
关于java - 返回数组java中的唯一数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41684717/