对于这个问题,“给定一个数组,其中每个元素出现三次,除了一个只出现一次的元素。找到一次出现的元素。”
我尝试了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;
}
答案 0 :(得分:6)
这是一种在实际代码中没有用的愚蠢技巧。在这种情况下,算法(显式)仅在所有元素存在3次时有效,除了存在一次的一个。如果任何对象存在偶数次,则会失败。在您的输入中,6出现两次,因此失败。
答案 1 :(得分: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;
}