0

对于这个问题,“给定一个数组,其中每个元素出现 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;
}
4

2 回答 2

6

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

于 2014-08-08T11:17:41.133 回答
0

如果您有一个数字中的两个,则它不起作用。你有两个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;
}
于 2014-08-08T11:33:03.323 回答