🔶力扣上一道有意思的题,参考了评论区的解法,一起来学习
🍔思路说明:
🌟举例说明 :
nums = [2,2,3,2]我们需要把其中的数字 ‘3’ 找出来
1️⃣把每个数都想成32位的二进制数(这里举例用4位即可)
2️⃣每一位累加起来 如果不进行进位 因为其他数出现次数都是3次 那么每一位上的值要么是3n 要么是3n+1
👉3n说明目标值对这位没有贡献
👉3n+1说明目标值对这位有贡献
3️⃣最后将有贡献位都单独拿出来放在结果中 即可得到目标值
🍟代码展示:
这道题中涉及了一些位操作,写了许多注释,帮助理解
💧代码仅供参考:
class Solution { public:int singleNumber(vector<int>& nums) {int ret=0;//目标值for(int i=0;i<32;i++){//从32位中第一位开始统计统计int mask=1<<i;//cnt用来记录该位上有多少个1int cnt=0;for(int j=0;j<nums.size();j++){if((nums[j]&mask)!=0){//统计在这位上有多少个1cnt++;}}//如果不是3倍 说明目标值对这位有贡献if(cnt%3!=0){//所以需要在结果中 将这位在结果中呈现ret |= mask;}}return ret;} };
🌮结语:
🫡你的点赞和关注是作者前进的动力!
🌞最后,作者主页有许多有趣的知识,欢迎大家关注作者,作者会持续更新有意思的代码,在有趣的玩意儿中成长!