【问题标题】:How can I simply check if a set of n numbers are all different?我怎样才能简单地检查一组 n 数字是否都不同?
【发布时间】:2012-07-03 22:03:30
【问题描述】:

我有 n 个整数,我需要一个快速的逻辑测试来确定它们都是不同的,而且我不想比较每个组合来找到匹配项......关于一个漂亮而优雅的方法的任何想法?

我不管你的想法是用什么编程语言,我可以转换!

【问题讨论】:

    标签: math numbers logic


    【解决方案1】:

    如果您的语言支持,请使用集合数据结构,您还可以考虑保留已见元素的哈希表。

    在python中你可以试试

    seen={}
    n_already_seen=n in seen
    seen[n]=n
    

    n_already_seen 将是一个布尔值,指示是否已经看到 n。

    【讨论】:

    • 发布一个只是您的较长版本的答案,我感到非常愚蠢。我完全没有注意到,我真的很抱歉!
    【解决方案2】:

    由于交换性和传递性,您不必检查每个组合;您可以简单地向下查看列表并检查每个条目与在它之后的每个条目。例如:

    bool areElementsUnique( int[] arr ) {
        for( int i=0; i<arr.Length-1; i++ ) {
            for( int j=i+1; j<arr.Length; j++ ) {
                if( arr[i] == arr[j] ) return false;
            }
        }
        return true;
    }
    

    请注意,内部循环不是从头开始,而是从下一个元素 (i+1) 开始。

    【讨论】:

      【解决方案3】:

      您可以使用哈希表或使用哈希的 Set 类型的数据结构。然后,您可以将所有元素插入哈希表或哈希集中,并且在插入时检查元素是否已经在表/集中。如果由于某种原因您不想随时检查,您可以插入所有数字,然后检查结构的大小是否小于 n。如果它小于 n,则必须有重复的元素。否则,它们都是独一无二的。

      这是一个非常紧凑的 Java 解决方案。时间复杂度摊销O(n),空间复杂度O(n)。

      public boolean areAllElementsUnique(int [] list)
      {
          Set<Integer> set = new HashSet<Integer>();
          for (int number: list)
              if (set.contains(number))
                  return false;
              else
                  set.add(number);
          return true;
      }
      

      【讨论】:

        猜你喜欢
        • 2017-12-16
        • 2019-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-02
        • 1970-01-01
        • 2020-12-01
        • 1970-01-01
        相关资源
        最近更新 更多