这道题是上一道题的变形,也是位运算,但是不论是同或或者异或,都不能解决问题,想不出来办法,看了答案。
答案上的思路,既然是其他数字都出现了三次,那么将所有数字的每一位对应的值相加,能被三整除的就说明,那个只出现一次的数字在这一位上的值是0,否则是1.
但是leetcode上给出了更简洁的答案,有限状态自动机(https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/solution/mian-shi-ti-56-ii-shu-zu-zhong-shu-zi-chu-xian-d-4/)
我的代码,代码不难写
public int singleNumber(int[] nums) {
int[] bit_value = new int[32];
for(int count = 0;count<32;count++){
bit_value[count] = 0;
}
for(int count = 0;count<nums.length;count++){
int residual = nums[count];
for(int count_bit = 0;count_bit<32;count_bit++){
int value = residual%2;
residual = residual/2;
bit_value[count_bit] += value;
if(residual == 0){
break;
}
}
}
int res = 0;
int value = 1;
for(int count_bit = 0;count_bit<32;count_bit++){
if(bit_value[count_bit]%3 != 0){
res += value;
}
value *= 2;
}
return res;
}
答案代码
public int singleNumber(int[] nums) {
int ones = 0, twos = 0;
for(int num : nums){
ones = ones ^ num & ~twos;
twos = twos ^ num & ~ones;
}
return ones;
}
作者:jyd
链接:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/solution/mian-shi-ti-56-ii-shu-zu-zhong-shu-zi-chu-xian-d-4/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。