剑指 Offer 56 - II. 数组中数字出现的次数 II
创始人
2024-05-30 20:42:24

剑指 Offer 56 - II. 数组中数字出现的次数 II

难度:middle\color{orange}{middle}middle


题目描述

在一个数组 numsnumsnums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。

示例 1:

输入:nums = [3,4,3,3]
输出:4

示例 2:

输入:nums = [9,1,7,9,7,9,7]
输出:1

限制:

  • 1<=nums.length<=100001 <= nums.length <= 100001<=nums.length<=10000
  • 1<=nums[i]<2311 <= nums[i] < 2^311<=nums[i]<231

算法

(位运算)

考虑数字的二进制形式,对于出现三次的数字,各 二进制位 出现的次数都是 3 的倍数。
因此,统计所有数字的各二进制位中 1 的出现次数,并对 3 求余,结果则为只出现一次的数字

在这里插入图片描述

以二进制形式看待数据,只有一个数出现了一次,其他数都出现了三次

将每一位为1的位累加,再%3,就是只出现一次的数。

复杂度分析

  • 时间复杂度:O(n)O(n)O(n),其中 nnn 是数组的长度。

  • 空间复杂度 : O(1)O(1)O(1)

C++ 代码

class Solution {
public:int singleNumber(vector& nums) {vector a(32);for (int num : nums) {for (int i = 0; i < 32; i ++) if ((num >> i & 1) == 1) a[i] = (a[i] + 1) % 3;}int res = 0;for (int i = 0; i < 32; i ++) {if (a[i] == 1) res = res | (1 << i);}return res;}
};

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...