问题描述:
Given a non-empty array of integers, every element appears three times except for one, which appears exactly once. Find that single one.
Input: [2,2,3,2] Output: 3
Input: [0,1,0,1,0,1,99] Output: 99
思路:
首先仿照 Single Number 相关解法,有等式[ 3∗(a+b+c)−(a+a+a+b+b+b+c) ] / 2=c
从而有
class Solution {
public int singleNumber(int[] nums) {
int sum_set = 0;
int sum_nums = 0;
HashSet<Integer> set = new HashSet<>();
for (int num : nums) {
set.add(num);
sum_nums += num;
}
for (int i : set) {
sum_set += i;
}
return (3 * sum_set - sum_nums) / 2;
}
}
但这么写无法Accepted,因为在数组过大时会发生溢出。因此对等式进行改进:(a+b+c) - [(a+a+a+b+b+b+c) - (a+b+c)] / 2 = c
再次转换成代码:
class Solution {
public int singleNumber(int[] nums) {
int sum_set = 0;
int sum_nums = 0;
HashSet<Integer> set = new HashSet<>();
for (int num : nums) {
set.add(num);
sum_nums += num;
}
for (int i : set) {
sum_set += i;
}
int temp = (sum_nums - sum_set) / 2;
return sum_set - temp;
}
}
Accepted