2012-11-28 71 views
1

我的真正目的是獲得唯一出現奇數次的數組元素。所以我發現它可以通過異或數組的所有元素來完成。就像這樣:C#如何在從控制檯讀取數組後異或所有int元素?

int[] arr = { 3, 4, 7, 7, 0, 4, 0, 7, 3 }; 
Console.WriteLine(arr[0]^arr[1]^arr[2]^arr[3]^arr[4]^arr[5]^arr[6]^arr[7]^arr[8]); 

然而,問題是,數組沒有給出,但正在從控制檯讀取,因此,我不知道如何進行XOR的元素被輸入後,他們。到目前爲止我可以編制的代碼是:

編輯:我設法正確地完成代碼,感謝您的幫助。

static void Main() 
     {     
     int N = int.Parse(Console.ReadLine()); 
     long[] rectArray = new long[N];   

     for (int i = 0; i < N; i++) 
     { 
      rectArray[i] = long.Parse(Console.ReadLine()); 
     } 
     long initial = rectArray[0]; 
     for (int i = 1; i < rectArray.Length; ++i) 
     { 
      initial ^= rectArray[i]; 
     }    
     Console.WriteLine(initial); 
     } 
} 

P.S我是真正的noob,所以請耐心等待! :)

回答

8

你可以寫一個循環:

int initial = 0; 
for(int i = 0; i < arr.Length; ++i) { 
    initial ^= arr[i]; 
} 
Console.WriteLine(initial); 
+1

感謝Esailija!它幫助! :) – Todo

10

沿着相同的路線Esailija的答案,但使用foreach - 採取的事實,即0^x == xx所有值:

int current = 0; 
foreach (int value in array) 
{ 
    current ^= value; 
} 
Console.WriteLine(current); 

編輯:正如評論中指出的那樣,LINQ的Aggregate方法也會這樣做 - 因爲我們很樂意在第一步中使用前兩個值,所以我們甚至不需要提供種子:

int xor = array.Aggregate((x, y) => x^y); 
+1

'arr.Aggregate(0,(a,b)=> a^b)'是否等價? – vcsjones

+0

@vcsjones:是的,但我可以發佈之前分心。與LINQ的其他部分相比,我發現'Aggregate'麻煩。將它自己發佈爲答案:) –

+0

不知道爲什麼我在'0^x',+1:D: – Esailija

3
  for (int i = 0; i < rectArray.Length; i++) 
      {      
       sum ^= rectArray[i]; 
      }