Leetcode 137.只出现一次的数字II

本文介绍了一种在数组中找到唯一出现一次的数字的算法,该数组中除一个元素外,所有其他元素均出现三次。算法实现了线性时间复杂度,并通过位操作实现了空间效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

只出现一次的数字II

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,3,2]

输出: 3

示例 2:

输入: [0,1,0,1,0,1,99]

输出: 99

 

将int数分为32位,那么按该题的要求,这32位的每一位,所出现过的数目必定是3N或3N+1,3N+1的位级必然是那唯一的一个元素贡献的。对int数res的每个位进行数组位与遍历,出现3N+1的即保留下来,最终刷完32位之后,可得结果。

 

 1 class Solution{
 2 public:
 3     int singleNumber(vector<int>& nums){
 4         int length = nums.size();
 5         int result = 0;
 6         for (int i = 0; i<32; i++){
 7             int count = 0;
 8             int mask = 1 << i;
 9             for (int j = 0; j<length; j++){
10                 if (nums[j] & mask)
11                     count++;
12             }
13             if (count % 3)
14                 result |= mask;
15         }
16         return result;
17     }
18 };

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值