2016-04-22 10 views
3

リートコードの問題です。 正確に2つの要素が1回だけ表示され、他のすべての要素が正確に2回表示されるnumの配列が与えられます。一度しか表示されない2つの要素を探します。ビット操作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}; 

} 
}; 

提出結果が間違った答えです。私はちょうど

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

に強調表示された部分を変更した場合

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

しかし、それは受け入れられています。 私は多くの時間を費やして考えましたが、まだ分かりません。たぶん、いくつかの型変換が起こったでしょうか?ありがとう

答えて

6

これは演算子の優先順位と関係があります。
初期のCでは&& and ||オペレータが遅れて追加されていたため、レガシープログラムを壊さないように非常に低い優先順位が与えられました。 & http://bytes.com/topic/c/answers/167377-operator-precedence

&をし、||:このフォーラムから

このStack overflow Questionは理由としては非常に良い答えを持っています演算子は後で「短絡」動作のために追加されました。 Dennis Ritchieは、論理演算子が追加されたときにビット単位演算子の優先順位が変更されるべきであったことを振り返ります。しかし、そのポイントと3台のコンピュータのインストールベースでの存在でCのソースコードの数百キロバイトと、デニスはここ


がある...それはC言語の変化の大きすぎるだろうと思いましたオペレータの優先順位を示すA Table
&より高い優先度で!=を表示します。

あなたがbitwise &を見ることができるようにテーブルの上に!=よりも低くなっているので、どのようなあなたのコードがやっていることは以下の通りです:

if ((differbit & i) != 0) 
:代わりに、私はあなたがする意図を前提と何の

if (differbit & (i!=0))