【问题标题】:Single occurrence of a number单次出现的数字
【发布时间】:2014-08-08 11:12:33
【问题描述】:

对于这个问题,“给定一个数组,其中每个元素出现 3 次,除了一个元素只出现一次。找到出现一次的元素。”

我尝试了http://www.geeksforgeeks.org/find-the-element-that-appears-once/ 给出的代码。 但是,当输入为 3,3,1,3,6,1,6,7,1 时,我得到的答案是 1。

请帮助我找出我正在做的错误。

#include<iostream>

using namespace std;

int getSingleOccurrence(int nArray[9], int n){
int ones = 0, twos=0;
int common_bit_mask=0;

for(int i=0;i<n;i++){
    twos|= ones & nArray[i];
    ones^=nArray[i];
    common_bit_mask = ~(ones & twos);
    ones&=common_bit_mask;
    twos&=common_bit_mask;
}
return ones;
}


int main(){
   int nArray[]={3,3,1,3,6,1,6,7,1};
   cout<<getSingleOccurrence(nArray,9);
   return 0;
}

【问题讨论】:

  • C 还是 C++?解决方案可能因语言而异。例如,在 C++ 中,I 将使用 std::unordered_multiset.
  • 数一下 6s。一个还是三个?
  • 您输入的数据无效,因此即使代码正确,您也不会得到有意义的结果。
  • @JoachimPileborg 无序集的复杂性在最坏的情况下是二次的。由于这是一个人为的不切实际的问题,它应该处理人为的不切实际的输入。
  • 根据 usingcout 它是 C++,但所提出的算法与语言无关。也许你应该澄清你是否需要这个,或者 C++ only 解决方案是否可以接受。

标签: c++ algorithm find-occurrences


【解决方案1】:

这是一种在实际代码中毫无用处的愚蠢技巧。在这种情况下,算法(明确地)仅在所有元素都出现 3 次时才有效,除了一个出现一次的元素。如果任何对象出现偶数次,它将失败。在您的输入中,6 出现了两次,所以它失败了。

【讨论】:

    【解决方案2】:

    如果你有一个数字中的两个,它就不起作用。你有两个6

    另外,请注意您不应该在方法参数中指定数组的长度。

    这可行:ideone

    #include <stdio.h>
    
    int getSingleOccurrence(int nArray[], int n){ //note no array length here
      int ones = 0, twos=0;
      int common_bit_mask=0;
      int i;
    
      for(i=0;i<n;i++){
        twos|= ones & nArray[i];
        ones^=nArray[i];
        common_bit_mask = ~(ones & twos);
        ones&=common_bit_mask;
        twos&=common_bit_mask;
      }
      return ones;
    }
    
    
    int main(){
       int nArray[]={3,3,1,3,6,1,6,7,1,6};
       int result = getSingleOccurrence(nArray,10);
       printf("Result %d", result);
       return 0;
    }
    

    【讨论】:

    • 线索在于长度。 9 的长度如何对这个问题有效?
    • 事实上,快速检查是看是否(n-1)%3==0。如果为 false,则绝对不是有效输入。
    猜你喜欢
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多