136题
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
思路:我们知道所有出现偶数次的数异或起来后结果肯定是0,因此我们将所有数异或在一起,答案就是呢个只出现一次的数
class Solution {
public int singleNumber(int[] nums) {
if(nums.length==0) return 0;
int ans=nums[0];
for(int i=1;i<nums.length;i++)
ans^=nums[i];
return ans;
}
}
137题
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,3,2]
输出: 3
示例 2:
输入: [0,1,0,1,0,1,99]
输出: 99
思路:因为每个数出现的次数都是奇数次,因此我们不能采用异或的方式,但是我们知道每个数的二进制表示的某一位如果出现3次,呢就说明这一位对答案没有贡献,因此我们可以标记每一位为1出现的次数,然后模3就是答案啦
class Solution {
public int singleNumber(int[] nums) {
int[] bit=new int[32];
for(int j=0;j<32;j++)
for(int i=0;i<nums.length;i++)
{
int num=nums[i]>>j;
bit[j]+=num&1;
}
int result=0;
for(int i=31;i>=0;i--)
{
result<<=1;
result+=bit[i]%3;
}
return result;
}
}