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

Java 如何计算数组中出现的唯一值的数量,java,arrays,loops,Java,Arrays,Loops,但有几个限制 无法创建任何其他数据结构,如数组、字符串等 无法修改作为参数传递给方法的数组,最后 无法对数组元素值进行排序或重新排列 我已经编写了这个解决方案,但它修改了作为参数传递给方法的数组 最有效的解决方案是将所有元素添加到HashSet并返回HashSet的大小。这将需要O(n)时间。但是,不允许使用“其他数据结构” 如果没有集合,您可以使用嵌套循环来查找O(n^2)时间中唯一元素的数量 int count = 0; for (int i = 0; i < arr.length;

但有几个限制

  • 无法创建任何其他数据结构,如数组、字符串等
  • 无法修改作为参数传递给方法的数组,最后
  • 无法对数组元素值进行排序或重新排列
  • 我已经编写了这个解决方案,但它修改了作为参数传递给方法的数组


    最有效的解决方案是将所有元素添加到
    HashSet
    并返回
    HashSet
    的大小。这将需要
    O(n)
    时间。但是,不允许使用“其他数据结构”

    如果没有
    集合
    ,您可以使用嵌套循环来查找
    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;
    
    这是一个简单的计数

    对循环使用嵌套的

    外部循环迭代数组
    arr[i]
    中的每个元素,而内部循环迭代
    i
    第四个元素之前的所有元素。如果在内部循环中有以前见过的元素,我们不计算它(通过将
    duplicate
    标志设置为true),否则,我们计算它(
    count++

    请注意,我们存在所有约束:

  • 仅使用了1个int变量,
    计数
  • 数组没有被修改
  • 没有进行分类或重新排列
  • public int countreplicates(int[]arr){
    整数计数=0;
    
    对于(int i=0;ii如果您不能使用任何其他数据结构,为什么要使用
    Map
    ?您包含了
    countDuplicates()
    的代码,但包含了
    countUnique()
    的输出。如果问题是关于
    countUnique()
    ,您应该发布该方法。请澄清您的问题,解释为什么不允许使用map,以及当您的代码不修改它时如何更改数组。例如,很抱歉,复制了错误的codeMap是一种数据结构。在您的代码中,您正在使用它,并且您说您不能使用它。@Andreas my bad.Thanks!这个解决方案解决了我的问题@Omri
     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
    
    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;
    
    return Arrays.stream(arr).distinct().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;
     }