【问题标题】:Finding how many different values there are in an array查找数组中有多少个不同的值
【发布时间】:2016-01-07 07:03:41
【问题描述】:

假设我有一个长度为n 的数组,其中唯一可以出现的值是0-9。我想创建一个递归函数,它返回数组中不同值的数量。

例如,对于以下数组:int[] arr = {0,1,1,2,1,0,1} --> 函数将返回 3,因为该数组中出现的唯一值是 012

函数接收一个int数组并返回int 像这样:

int numOfValues(int[] arr)

【问题讨论】:

  • 你尝试了什么?
  • 将数组放入Set,然后检查Set的大小
  • 这个特殊的任务不适合递归。您无法从该切片的两半中不同项目的数量中推断出该切片中不同项目的数量。
  • 不幸的是,除了草稿不起作用,我什么都没有。我不清楚递归,我只是想知道这个问题是否可以使用递归来解决。基本情况是,如果数组为空,则返回 0,如果 array.length 为 1,则返回 1。现在我正在尝试找出第三种情况的循环以及如何将其汇总。

标签: java arrays recursion


【解决方案1】:

如果您使用的是 Java 8,则可以使用简单的单行代码来做到这一点:

private static int numOfValues(int[] arr) {
    return (int) Arrays.stream(arr).distinct().count();
}

Arrays.stream(array) 返回一个由数组元素组成的IntStream。然后,distinct() 返回一个 IntStream,仅包含该流的不同元素。最后,count() 返回此流中元素的数量。

请注意,count() 返回 long,因此在您的情况下,我们需要将其转换为 int


如果你真的想要一个递归的解决方案,你可以考虑以下算法:

  • 如果输入数组的长度为 1,则元素是不同的,因此答案为 1。
  • 否则,让我们删除第一个元素并计算这个新数组上不同元素的数量(通过递归调用)。然后,如果第一个元素包含在这个新数组中,我们不再计算它,否则我们计算它并加 1。

这应该让您有足够的洞察力在代码中实现这一点。

【讨论】:

  • 他不是要递归函数吗?
  • @Ata 是的,我为递归解决方案添加了一个算法。我没有提供代码,而是提供了想法。这值得否决吗?
  • 不是现在,但是我没有看到递归实现。
  • @Ata 我最初发布了代码,但最终将其删除(如果需要,您可以在修订历史中看到它)但我认为 OP 会通过自己实现来了解更多信息。用英文写的算法很容易解释。你会考虑取消你的反对票吗?
【解决方案2】:

试试这样:

public int myFunc(int[] array) {

     Set<Integer> set = new HashSet<Integer>(array.length);
     for (int i : array) {
        set.add(i);
     }
     return set.size();
 }

即在Set里面添加数组的元素,然后就可以返回Set的大小了。

【讨论】:

    【解决方案3】:
    public int f(int[] array) {
       int[] counts = new int[10];
       int distinct = 0;
       for(int i = 0; i< array.length; i++) counts[array[i]]++;
       for(int i = 0; i< counts.length; i++) if(counts[array[i]]!=0) distinct++;
       return distinct;
    
     }
    

    您甚至可以更改代码以获取每个值的出现次数。

    【讨论】:

      【解决方案4】:

      你可以试试下面的代码sn-p,

      Integer[] arr = {0,1,1,2,1,0,1};
      Set<Integer> s = new HashSet<Integer>(Arrays.asList(arr));
      

      输出:[0, 1, 2]

      【讨论】:

        【解决方案5】:

        当您要求递归实现时,这是一种不好的方法。我说不好,因为递归不是解决这个问题的最好方法。还有其他更简单的方法。当您想要根据之前从该函数生成的项目评估下一个项目时,通常会使用递归。就像斐波那契数列一样。

        当然,您必须在使用此函数之前克隆数组,否则您的原始数组将被更改(使用 countDistinct(arr.clone(), 0); 调用它)

        public static int countDistinct(int[] arr, final int index) {
            boolean contains = false;
        
            if (arr == null || index == arr.length) {
                return 0;
            } else if (arr.length == 1) {
                return 1;
            } else if (arr[index] != -1) {
                contains = true;
                for (int i = index + 1; i < arr.length; i++) {
                    if (arr[index] == arr[i]) {
                        arr[i] = -1;
                    }
                }
            }
        
            return countDistinct(arr, index + 1) + (contains ? 1 : 0);
        }
        

        【讨论】:

          【解决方案6】:
          int numOfValues(int[]  arr)  {
              boolean[]  c = new boolean[10];
              int count = 0;
              for(int i =0; i < arr.length; i++) {
                  if(!c[arr[i]]) {
                      c[arr[i]] = true;
                      count++;
                  } 
              } 
              return count;
          } 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-09-13
            相关资源
            最近更新 更多