解法都在代码里,不懂就留言或者私信,比136题稍微难一点点
如果没看过我写的136题的先看看
Leetcode面试经典150题-136.只出现一次的数字-CSDN博客
class Solution {
/**这个题相对136题是有一点点的难,但是还行,基本解题思路如下:
既然其他的数字都出现了三次,也就是说这些出现三次的数所有的位上的1都能被3整除
我们看以下每一位上1的数量%3就是我们这个出现一次的元素的这个位置的值,如果是0,拿答案当前位就是0,如果是1,当前位就是1
然后把每一位的答案拼接起来就是答案 */
public int singleNumber(int[] nums) {
/**当前是哪一位*/
int curDigit = 0;
/**答案存放的遍历*/
int ans = 0;
while(curDigit <= 31) {
int countOfCurDigit = 0;
/**统计所有数中当前位的1的数量 */
for(int num : nums) {
/**取curDigit位的1 */
countOfCurDigit += ((num >> curDigit) & 1);
}
/**取余之后就是当前数的当前位(1或者0) */
ans |= (countOfCurDigit % 3) << curDigit;
/**挪到下一位继续 */
curDigit ++;
}
return ans;
}
}
运行结果,就那样吧,可以尝试把循环改变以下提高,但是我觉得没这必要,算法的东西就是这么多,再优化跟算法无关,都是coding问题