如何计算数组中出现的唯一值的数量

时间:2019-12-30 07:23:33

标签: java arrays loops

  

但是有几个约束条件

  1. 无法创建任何其他数据结构,例如数组,字符串等。
  2. 无法修改作为参数传递给方法的数组,最后,
  3. 无法对数组元素值进行排序或重新排列。
  

我已经写了这个解决方案,但是它修改了传递给方法作为参数的数组。

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

2 个答案:

答案 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++)。

请注意,我们受到所有限制:

  1. 仅使用了1个整数count
  2. 该数组未修改。
  3. 未进行排序或重新排列。
 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;
 }
相关问题