0
点赞
收藏
分享

微信扫一扫

Java描述 LeetCode,剑指 Offer 56 - II. 数组中数字出现的次数 II

程序员阿狸 2022-02-01 阅读 85

𝑰’𝒎 𝒉𝒉𝒈, 𝑰 𝒂𝒎 𝒂 𝒈𝒓𝒂𝒅𝒖𝒂𝒕𝒆 𝒔𝒕𝒖𝒅𝒆𝒏𝒕 𝒇𝒓𝒐𝒎 𝑵𝒂𝒏𝒋𝒊𝒏𝒈, 𝑪𝒉𝒊𝒏𝒂.

  • 🏫 𝑺𝒉𝒄𝒐𝒐𝒍: 𝑯𝒐𝒉𝒂𝒊 𝑼𝒏𝒊𝒗𝒆𝒓𝒔𝒊𝒕𝒚
  • 🌱 𝑳𝒆𝒂𝒓𝒏𝒊𝒏𝒈: 𝑰’𝒎 𝒄𝒖𝒓𝒓𝒆𝒏𝒕𝒍𝒚 𝒍𝒆𝒂𝒓𝒏𝒊𝒏𝒈 𝒅𝒆𝒔𝒊𝒈𝒏 𝒑𝒂𝒕𝒕𝒆𝒓𝒏, 𝑳𝒆𝒆𝒕𝒄𝒐𝒅𝒆, 𝒅𝒊𝒔𝒕𝒓𝒊𝒃𝒖𝒕𝒆𝒅 𝒔𝒚𝒔𝒕𝒆𝒎, 𝒎𝒊𝒅𝒅𝒍𝒆𝒘𝒂𝒓𝒆 𝒂𝒏𝒅 𝒔𝒐 𝒐𝒏.
  • 💓 𝑯𝒐𝒘 𝒕𝒐 𝒓𝒆𝒂𝒄𝒉 𝒎𝒆:𝑽𝑿
  • 📚 𝑴𝒚 𝒃𝒍𝒐𝒈: 𝒉𝒕𝒕𝒑𝒔://𝒉𝒉𝒈𝒚𝒚𝒅𝒔.𝒃𝒍𝒐𝒈.𝒄𝒔𝒅𝒏.𝒏𝒆𝒕/
  • 💼 𝑷𝒓𝒐𝒇𝒆𝒔𝒔𝒊𝒐𝒏𝒂𝒍 𝒔𝒌𝒊𝒍𝒍𝒔:𝒎𝒚 𝒅𝒓𝒆𝒂𝒎

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;

还有一种解法是有限状态机,那个我不会= =,感觉写出这个来也可以了。

举报

相关推荐

0 条评论