给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:你的算法应该具有线性时间复杂度。
示例 1:
输入: [2,2,3,2]
输出: 3
示例 2:
输入: [0,1,0,1,0,1,99]
输出: 99
使用 HashSet 对出现的元素进行记录,使用 set_sum 记录 HashSet的元素和,使用 arr_sum 记录数组的总和。根据题目描述有:
数组:[a,a,a,b,c,c,c]
set_sum : a+b+c
arr_sum : 3a+b+3c
b = (3*set_num - arr_sum) / 2
class Solution {
public int singleNumber(int[] nums) {
Set<Integer> set = new HashSet<>();
//防止数据超出int范围
long arr_sum = 0;
long set_sum = 0;
for(int num : nums){
if(set.add(num)){
set_sum += num;
}
arr_sum += num;
}
return (int)((3*set_sum-arr_sum)/2);
}
}
class Solution {
public int singleNumber(int[] nums) {
int len = nums.length, one = 0, two = 0;
for(int i = 0; i < len; i++){
one = (nums[i] ^ one) & ~two;
two = (nums[i] ^ two )& ~one;
}
return one;
}
}