【问题标题】:Determining whether values held in variables are unique确定变量中保存的值是否唯一
【发布时间】:2014-05-21 21:59:13
【问题描述】:

我正在尝试“蛮力”一个数字难题,其中一个标准是计算只使用 0-9 中的每个数字一次。我首先提取一组变量的每个可能答案的单个数字(但将其更改为数组不会有什么大问题),但确定它们是否唯一是一个瓜 - 看起来可能很多 if语句条件:if a!=b && b!=c && a!=c;这将得到 10 个变量的长篇大论!

我错过了一个明显的技巧吗?碰巧我正在使用C,但可以使用Java;绝不是这方面的专家。

【问题讨论】:

  • 您可以尝试使用位向量。将变量声明为 unsigned short int,并将每个位视为不同的数字(例如:数字 0 是位 0,数字 1 是位 1..等),稍后您可以查看数字是否为 1、2 , 4, 8, 16, ... 检查是否只有一位数字。
  • 1 到 9 之间的九个唯一数之和为 45;这有帮助吗?
  • @EricLippert 可能不是,因为其他各种 10 位数字的总和也为 45
  • @MattMcNabb:好点。 John Tortugo 的建议更好。

标签: java c algorithm


【解决方案1】:

在 C 中,这是一种方法:

// use an array, not a bunch of separate variables
int the_numbers[NUM_NUMBERS]; 

// here we assume you have filled in the numbers and validated
// that they are all in the range 0-9

bool duplicate_found = false;

bool seen[10] = { 0 };

for (int ii = 0; ii < NUM_NUMBERS; ++ii)
    if ( seen[ the_numbers[ii] ]++ )
    {
         duplicate_found = true;
         break;
    }

后缀-++ 是一种快捷的写法,如果它已经设置了,我们想突破它;如果它尚未设置,我们想增加它(我们不在乎是否在它已经设置时也增加它。

【讨论】:

    【解决方案2】:

    您需要使用提供set operations 的数据结构 - 这使得唯一性测试就像检查该值是否已存在于集合中一样简单。

    在 Java 中,Set interface 及其实现是实现该效果的最通用方法,如果您只需要唯一性测试,HashSet 是最有效的。

    也就是说,如果您只有一堆连续的整数要测试,那么BitSet 可能是更合适的选择。或者,您甚至可以使用简单的布尔值数组编写自己的位集:

    boolean seen[] = new boolean[10];
    ...
    // Mark digit 7 as seen
    seen[7] = true;
    ...
    // Test if digit 3 has been seen
    if (seen[3]) {
        ...
    }
    

    【讨论】:

      【解决方案3】:

      只需将您的数字放入一组中,然后检查它是否已经包含密钥。即

      @Test
      public void nTest() throws Exception{
          Set<Integer> numbers = new HashSet<Integer>();
          numbers.add(1);
          numbers.add(11);
          numbers.add(1111);
      
          Set<Integer> newNumbers = new HashSet<Integer>();
          newNumbers.add(1);
          newNumbers.add(11);     
          newNumbers.add(111);
      
          //adds 111 to list  
          for(int a : newNumbers){
              if(!numbers.contains(a)){numbers.add(a);}
          }               
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 2018-02-07
        • 2016-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多