Day 92
題目描述
思路
初次思路:想不出來 哈哈哈指揮hash 就不放出來丟人了
題解思路:這個做法是每次確定一個位是否為答案為1 的位
具體是這樣的:由于除了答案外每個數字都會出現3次,那么我們不考慮答案的情況,那么一個二進制位的可能為0或者1,將所有數組中(排除答案)在這個位的值相加必然是3的倍數,二進制位為0無所謂
基于這點,如果某個位數不是3的倍數,是不是就說明答案在這個位是1,于是有了以下做法
class Solution {public int singleNumber(int[] nums) {int ans = 0;//存放結果for (int i = 0; i < 32; ++i) {int total = 0;//記錄該二進制位的值之和for (int num: nums) {total += ((num >> i) & 1);//右移后取最低位(即為i循環的這位的值)}if (total % 3 != 0) {//如果這個位所有的值之和不是3的倍數,那么答案這位就是1ans |= (1 << i);//那就將1左移到這位,與其進行或運算(低位全為0,或不會改變低位的結果)}}return ans;}
}