给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
- class Solution {
- public:
- int singleNumber(vector<int>& nums) {
- int ret=0;
-
- for(int i=0;i<32;i++)//第i位
- {
- int sum=0;//该位1的和
- for(int j=0;j
size();j++)//第j个数字 - {
- if( ( (nums[j] >> i) & 1) == 1) ++sum;
- }
- sum%=3;
- if(sum)
- ret=(1<
-
- }
- return ret;
- }
- };
第二题 两整数之和
给你两个整数 a 和 b ,不使用 运算符 + 和 - ,计算并返回两整数之和。
https://leetcode.cn/problems/sum-of-two-integers/
- class Solution {
- public:
- int getSum(int a, int b) {
-
- while(a != 0)//把a当做进位
- {
- int carry = (a & b) <<1;//找到进位
- b=a^b;//(无进位相加处理)
- a=carry;//(存储进位信息,循环无进位相加,直到被加的数等于零。)
- }
- return b;
- }
- };
第三题 消失的两个数字

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
只能处理有序数组
- class Solution {
- public:
- vector<int> missingTwo(vector<int>& nums) {
- int now=1,a[2]={0};
- int q=0;
- for(auto e: nums)
- {
- cout<
- }
- while(now
0]) - {
- if(q>=2) return {a[0],a[1]};
- a[q++]=now;
- now++;
- }
- if(q>=2) return {a[0],a[1]};
- for(int i=0;i
size()+2;i++) - {
- if(q>=2) return {a[0],a[1]};
- if(i>=nums.size())//越界了还没找到
- {
- while(q<2) a[q++]=now++;
- break;
- }
- if(now != nums[i])
- {
- int tmp=i;
- while(now != nums[i])//连续的情况
- {
- a[q++]=now++;
- if(q>=2) return {a[0],a[1]};
- }
- now++;
- }
- else now++;
- }
-
- return {a[0],a[1]};
- }
- };
可以排序一下
- class Solution {
- public:
- vector<int> missingTwo(vector<int>& nums) {
- int now=1,a[2]={0};
- int q=0;
- sort(nums.begin(),nums.end());
- while(now
0]) - {
- if(q>=2) return {a[0],a[1]};
- a[q++]=now;
- now++;
- }
- if(q>=2) return {a[0],a[1]};
- for(int i=0;i
size()+2;i++) - {
- if(q>=2) return {a[0],a[1]};
- if(i>=nums.size())//越界了还没找到
- {
- while(q<2) a[q++]=now++;
- break;
- }
- if(now != nums[i])
- {
- int tmp=i;
- while(now != nums[i])//连续的情况
- {
- a[q++]=now++;
- if(q>=2) return {a[0],a[1]};
- }
- now++;
- }
- else now++;
- }
-
- return {a[0],a[1]};
- }
- };
位运算解法最优
- int tmp=0;
- for(auto e : nums)
- {
- tmp^=e;
- }
- for(int i = 1;i<=nums.size()+2;i++)
- {
- tmp^=i;
- }
- //现在tmp中存的是a^b
- int diff=0;
- while(diff<32)
- {
- if( ((tmp>>diff) & 1)==1) break;
- diff++;
- }
- int a=0,b=0;//记得初始化
- for(auto e :nums)
- {
- if(((e>>diff) & 1)==1) a^=e;
- else b^=e;
- }
-
- for(int i=1;i<=nums.size()+2;i++)//小于等于漏了
- {
- if(((i>>diff) & 1)==1) a^=i;
- else b^=i;
- }
- return {a,b};
-
相关阅读:
小家电Type-C接口PD诱骗芯片 6500
附录10-JS正则
flask-vue-sqlite3-->api接口-优化版本
【Linux】多路IO复用技术③——epoll详解&如何使用epoll模型实现简易的一对多服务器(附图解与代码实现)
什么牌子的led台灯质量好?五款Led护眼台灯推荐
Spring Cloud Alibaba【Sentinel控制台环境安装基于Linux、将应用接入Sentinel、流量控制概述、流控模式之直接模式、流控模式之关联模式 】(六)
JAVA算法练习(10):绳圈
《数据结构与算法基础 by王卓老师》学习笔记——1.4算法与算法分析
基于改进粒子群优化算法的柔性车间调度问题(Python代码实现)
Python Socket 基础多用户编程
-
原文地址:https://blog.csdn.net/m0_74234485/article/details/134065736