但是有几个约束条件
我已经写了这个解决方案,但是它修改了传递给方法作为参数的数组。
public int countUnique(int[] arr) {
int result = 0;
int[] temp = arr;
for(int i=0; i<arr.length; i++) {
if(temp[i]==Integer.MIN_VALUE) {
continue;
}
int tempVal = temp[i];
for(int j=0 ; j<arr.length; j++) {
if(tempVal==temp[j]) {
temp[j]= Integer.MIN_VALUE;
}
}
result =result+1;
}
return result;
}
以下是一个示例
1. countUnique({1, 0, 1, 0, 1})
2. expected result : 2
3. my resuly : 2
4. expected array after method call : {1, 0, 1, 0, 1}
5. array after method call : {-2147483648, -2147483648, -2147483648, -214748364...}
6. error : incorrect parameter value(s) after method call
答案 0 :(得分:3)
最有效的解决方案是将所有元素添加到HashSet
并返回HashSet
的大小。这将花费O(n)
时间。但是,不允许使用“其他数据结构”。
如果没有Set
,则可以使用嵌套循环来查找O(n^2)
时间内唯一元素的数量。
int count = 0;
for (int i = 0; i < arr.length; i++) {
boolean unique = true;
for (int j = 0; j < i; j++) {
if (arr[i] == arr[j]) {
unique = false;
break;
}
}
if (unique) {
count++;
}
}
return count;
说明:
对于数组的每个元素(索引为i
),您将遍历索引较小的所有元素,并检查该元素是否已针对某个索引j
<i
出现。如果没有,则增加唯一元素的数量。
或者您可以使用IntStream
(但您可能不应该这样做):
return Arrays.stream(arr).distinct().count();
答案 1 :(得分:0)
这很简单。
使用嵌套的for
循环。
外部循环遍历数组arr[i]
中的每个元素,而内部循环遍历第i
个元素之前的所有元素。如果内部循环中以前已经有元素,我们就不对其进行计数(通过将duplicate
标志设置为true),否则,我们就对其进行计数(count++
)。
请注意,我们受到所有限制:
count
。 public int countDuplicates(int[] arr) {
int count = 0;
for(int i=0; i<arr.length; i++){
boolean duplicate = false;
for(int j=0; j<i; j++){
if(arr[i] == arr[j])
{
duplicate = true;
break;
}
}
if(!duplicate)
count++;
}
return count;
}