𝑰’𝒎 𝒉𝒉𝒈, 𝑰 𝒂𝒎 𝒂 𝒈𝒓𝒂𝒅𝒖𝒂𝒕𝒆 𝒔𝒕𝒖𝒅𝒆𝒏𝒕 𝒇𝒓𝒐𝒎 𝑵𝒂𝒏𝒋𝒊𝒏𝒈, 𝑪𝒉𝒊𝒏𝒂.
- 🏫 𝑺𝒉𝒄𝒐𝒐𝒍: 𝑯𝒐𝒉𝒂𝒊 𝑼𝒏𝒊𝒗𝒆𝒓𝒔𝒊𝒕𝒚
- 🌱 𝑳𝒆𝒂𝒓𝒏𝒊𝒏𝒈: 𝑰’𝒎 𝒄𝒖𝒓𝒓𝒆𝒏𝒕𝒍𝒚 𝒍𝒆𝒂𝒓𝒏𝒊𝒏𝒈 𝒅𝒆𝒔𝒊𝒈𝒏 𝒑𝒂𝒕𝒕𝒆𝒓𝒏, 𝑳𝒆𝒆𝒕𝒄𝒐𝒅𝒆, 𝒅𝒊𝒔𝒕𝒓𝒊𝒃𝒖𝒕𝒆𝒅 𝒔𝒚𝒔𝒕𝒆𝒎, 𝒎𝒊𝒅𝒅𝒍𝒆𝒘𝒂𝒓𝒆 𝒂𝒏𝒅 𝒔𝒐 𝒐𝒏.
- 💓 𝑯𝒐𝒘 𝒕𝒐 𝒓𝒆𝒂𝒄𝒉 𝒎𝒆:𝑽𝑿
- 📚 𝑴𝒚 𝒃𝒍𝒐𝒈: 𝒉𝒕𝒕𝒑𝒔://𝒉𝒉𝒈𝒚𝒚𝒅𝒔.𝒃𝒍𝒐𝒈.𝒄𝒔𝒅𝒏.𝒏𝒆𝒕/
- 💼 𝑷𝒓𝒐𝒇𝒆𝒔𝒔𝒊𝒐𝒏𝒂𝒍 𝒔𝒌𝒊𝒍𝒍𝒔:𝒎𝒚 𝒅𝒓𝒆𝒂𝒎
1-1:题目描述
在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
示例 1:
输入:nums = [3,4,3,3]
输出:4
示例 2:
输入:nums = [9,1,7,9,7,9,7]
输出:1
限制:
1 <= nums.length <= 10000
1 <= nums[i] < 2^31
通过次数104,456提交次数129,991
1-2:位移运算解法
首先分析题目,这里的题目和上一道Java描述 LeetCode,剑指 Offer 56 - I. 数组中数字出现的次数
的区别在于,这里出现的是三次,对于出现三次的就不能单纯通过位移运算来解决了,首先看一个例子nums = [3,4,3,3],我们在二进制中表示出来。
就可以突然发现如果把每个位上出现1的进行统计,那么对应的那个位上的一定是3的倍数,那么剩下来的那个就是目标数的二进制表示,所以我们用count[32]数组来进行1的统计,统计完了之后再把每个位上面的数字对3求余,最后再从二进制数组,恢复成一个单独的数字即可。代码如下:
int n = nums.length;
int[] count = new int[32];
int m = count.length;
int number = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
count[j] += nums[i] & 1;
nums[i] >>>= 1;
}
}
for (int i = 0; i < m; i++) {
count[i] %= 3;
}
for (int i = 0; i < m; i++) {
number <<= 1;
number |= count[31 - i];
}
return number;
还有一种解法是有限状态机,那个我不会= =,感觉写出这个来也可以了。