2016-04-22 71 views
3

這是一個leetcode問題。 給定一個數字nums數組,其中恰好兩個元素只出現一次,其他所有元素只出現兩次。找出只出現一次的兩個元素。位操作AND

例如: 給定nums = [1,2,1,3,2,5],返回[3,5]。 我的代碼是:

class Solution { 
public: 
vector<int> singleNumber(vector<int>& nums) { 
int axorb=0; 
    for(auto i:nums) axorb=axorb^i; 
    int differbit=(axorb&(axorb-1))^axorb; 
    int group3=0, group5=0; 
    for(auto i:nums) 

if(differbit&i!=0) group5=group5^i;

 else group3=group3^i; 
     return vector<int>{group3,group5}; 

} 
}; 

提交的結果是錯誤的答案。

Input:[0,0,1,2] 
Output:[3,0] 
Expected:[1,2] 

但如果我只是改變高亮部分

if(differbit&i) group5=group5^i; 

被接受。 我花了很多時間思考,但仍然不知道。也許某些類型轉換髮生了?謝謝

回答

6

這與操作符優先級有關。
由於在早期的C操作系統中,&& and ||延遲加載,所以它的優先級很低,所以它不會破壞傳統程序。

Stack overflow Question有一個很好的答案,爲什麼:

從這個論壇:http://bytes.com/topic/c/answers/167377-operator-precedence

的& &和||運營商稍後加入了「短路」行爲。 Dennis Ritchie回想起,當添加邏輯運算符時,位運算符的優先級應該已經改變。不過幾百千字節的C源代碼存在於這一點,並已安裝的三臺電腦基地,丹尼斯認爲這將是太大了C語言的變化......


這裏顯示運算符優先級的A Tableenter image description here
顯示!=的優先級高於&

正如你可以看到bitwise &!=在桌子下,讓你的代碼正在做的是以下幾點:

if (differbit & (i!=0)) 

什麼,而不是我假設你的意思做:

if ((differbit & i) != 0)