pytest.main()啟動之後未執行測試用例的問題
1 基本概念
1.1 符號
異或是一種二進位制的位運算,符號以 XOR 或 ^ 表示。
1.2 運算規則
相同為0,不同為1,即
1 ^ 1 = 0
0 ^ 0 = 0
1 ^ 0 = 1
由運算規則可知,任何二進位制數與零異或,都會等於其本身,即 A ^ 0 = A。
1.3 異或性質
(1)交換律: A ^ B = B ^ A
(2)結合律: ( A ^ B ) ^ C = A ^ ( B ^ C )
(3)自反性: A ^ B ^ B = A (由結合律可推: A ^ B ^ B = A ^ ( B ^ B ) = A ^ 0 = A)
2.運用
2.1 變數交換
示例:將 a 和 b 兩個變數值交換,例如: a = 3,b = 7,交換後,a = 7,b = 3。
1 // 常規方法 2 int temp = a; // temp = 3 3 a = b; // a = 7 4 b = temp; // b = 3 5 6 // 異或方法 7 a = a ^ b; // a = 3 ^ 7 8 b = a ^ b; // b = (3 ^ 7) ^ 7 = 3 ^ (7 ^ 7) = 3 9 a = a ^ b; // a = (3 ^ 7) ^ (3 ^ 7 ^ 7) = (3 ^ 3) ^ (7 ^ 7) ^ 7 = 7
2.2 排除偶次重複
示例:在一個整數陣列中,僅存在一個不重複的數字,其餘數字均出現兩次(或偶數次),找出不重複數字。
P1469 找筷子 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
1 int n; 2 scanf("%d",&n); 3 4 int ans=0; 5 for(int i=1;i<=n;i++) 6 { 7 int x; 8 scanf("%d",&x); 9 ans^=x; 10 } 11 12 printf("%d\n",ans);
2.3 排除偶次重複變種
示例:將數字1-999存放在一個大小為1000的陣列中,其中只有一個數字重複出現兩次,找出重複數字。
將1000個整數依次異或運算,最終結果就是重複的數字,相當於重複數字與0進行異或,得到其本身。
1 int result = 0; 2 for (int index = 0; index < numArray.length; index++) { 3 result = result ^ numArray[index]; 4 } 5 return result;
2.4 只出現一次的數字
題目:給定一個整數陣列 nums,其中恰好有兩個元素只出現一次,其餘所有元素均出現兩次。 找出只出現一次的那兩個元素。
思路:
(1) 先通過一次異或操作,重複元素會被抵消,最終結果相當於兩個單次出現的元素(分別記為one和two)的異或值;
(2) 由異或規則可知,若兩個元素one和two的異或值的某二進位制位為1,則表示兩個元素在該二進位制位上的值不同,即分別為1和0,找到其中一個滿足條件(為1)的二進位制位(記為bitValue);
(3) 根據(2)找到的二進位制位bitValue,可以將原陣列分成兩個部分,one 和 two 分別在兩個部分,而相同的重複元素也會被分到同一個部分(因為其相應的二進位制位的值是相同的);
(4) 對於兩個部分再次進行異或操作,即相當於 排除偶次重複 問題,最終可以得到兩個題解。
1 class Solution { 2 3 public int[] singleNumber(int[] nums) { 4 5 // 通過異或操作,最終結果等於兩個單次出現的元素的異或值。 6 int filterResult = 0; 7 for (int num : nums) { 8 filterResult ^= num; 9 } 10 11 // 計算首個為1(從右側開始)的二進位制位的值 12 int bitValue = filterResult & (filterResult - 1) ^ filterResult; 13 14 // 以首個為1的二進位制位將原陣列分為兩個部分並分別進行異或運算,最終結果為兩個題解。 15 int oneResult = 0, twoResult = 0; 16 for (int num : nums) { 17 if ((num & bitValue) > 0) { 18 oneResult ^= num; 19 } else { 20 twoResult ^= num; 21 } 22 } 23 24 return new int[]{oneResult, twoResult}; 25 } 26 }