位运算:【leedcode:只出现一次的数字】
文章目录
- 136. 只出现一次的数字
- 137. 只出现一次的数字 II
- 260. 只出现一次的数字 III
136. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
通过位运算,我们知道:
思路:
基于异或的性质,
我们可以直接将全部元素异或。
这样的话,结果就是0异或x,就得出了x的值。
int singleNumber(int* nums, int numsSize)
{int ret = 0;for(int i = 0;i<numsSize;i++){ret^=nums[i];}return ret;
}
137. 只出现一次的数字 II
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
示例 1:
输入:nums = [2,2,3,2]
输出:3
示例 2:
输入:nums = [0,1,0,1,0,1,99]
输出:99
思路:
如果我们在每个二进制位上进行加减,
由于其他数字都是3个,对他们的和取余为0.
这样的话我们可以得出单独的数x的每一个二进制位,
利用左移即可求出x。
int singleNumber(int* nums, int numsSize)
{int i = 0;
int j = 0;
int sum = 0;
for(i = 0;i<32;i++)
{size_t count = 0;for(j=0;j<numsSize;j++){count+=(nums[j]>>i)&1;}sum+=(count%3)<<i;
}
return sum;
}
260. 只出现一次的数字 III
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
进阶:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
示例 1:
输入:nums = [1,2,1,3,2,5]
输出:[3,5]
解释:[5, 3] 也是有效的答案。
示例 2:
输入:nums = [-1,0]
输出:[-1,0]
示例 3:
输入:nums = [0,1]
输出:[1,0]
思路:
得到上一题的启示,我们是不是还可以用位运算来解题呢?
如果数组是由很多组一对数字和一个单独的数字x组成,
我们仍可以全部异或。
但是本题是两个单独的数字,
我们自然想到了将这群数字分成两组,然后使用异或。
在所有元素中,取二进制第x位为1的元素全部异或,就可以得出一个单独的数字x。
由于一开始就得出了所有元素异或的结果x异或y,
现在又有了x,自然可以求出y。
代码如下:
int* singleNumber(int* nums, int numsSize, int* returnSize)
{所有元素异或int ret = 0;for(int i = 0;i < numsSize;i++){ret^=nums[i];}寻找二进制位中的1,下标存入posint pos = 0;for(int i = 0;i < 32;i++){if((ret>>i)&1==1){pos = i;break;}}int single_1=0;int single_2=0;分组,求single_1for(int i = 0;i < numsSize;i++){if((nums[i]>>pos)&1==1){single_1^=nums[i];}}//利用single_1和ret求出single_2single_2=single_1^ret;*returnSize=2;int *ans=malloc(sizeof(int)*2);ans[0]=single_1;ans[1]=single_2;return ans;
}
- 时间复杂度:O(n)。
- 空间复杂度:O(1)。
图解:
int ret = 0;for(int i = 0;i < numsSize;i++){ret^=nums[i];}int pos = 0;for(int i = 0;i < 32;i++){if((ret>>i)&1==1){pos = i;break;}}
int single_1=0;int single_2=0;for(int i = 0;i < numsSize;i++){if((nums[i]>>pos)&1==1){single_1^=nums[i];}}single_2=single_1^ret;
以上就是今天位运算的全部内容了。
位运算:【leedcode:只出现一次的数字】相关推荐
- 位运算使奇数+1 偶数-1_C ++程序检查数字是奇数还是偶数
位运算使奇数+1 偶数-1 Below I have shared the C++ program to check a number is odd or even. 下面我共享了C ++程序来检查数 ...
- LeetCode-位运算-36. 只出现一次的数字
136. 只出现一次的数字 思路一:异或,当不同的数异或肯定会保留下来,相同的数异或之后,就会相互抵消. class Solution {public:int singleNumber(vector& ...
- Java位运算之2的N次幂、整数转换、寻找只出现一次的数
Java位运算 位运算:只能对整数进行位运算,可加快计算机计算速度.因为所有数在内存中都是以二进制存放,故直接对数的二进制位进行操作非常快,比如乘法.除2操作:通过左右移二进制位即可,无需将数转为十进 ...
- 位运算实现用户留存率
统计留存率之前先弄清一下留存率的概念,百度百科中是这么说的: 用户在某段时间内开始使用应用,经过一段时间后,仍然继续使用应用的被认作是留存: 这部分用户占当时新增用户的比例即是留存率,会按照每隔1单位 ...
- LeetCode 318. 最大单词长度乘积(位运算)
1. 题目 给定一个字符串数组 words,找到 length(word[i]) * length(word[j]) 的最大值,并且这两个单词不含有公共字母.你可以认为每个单词只包含小写字母.如果不存 ...
- 全面解读Math对象及位运算
<p>本文转载自:<a href="https://segmentfault.com/a/1190000008786789" title="全面解读Ma ...
- CH0104 起床困难综合症(位运算典例)
传送门:起床困难综合症 思路:要知道位运算永远只会改变本位,与其它位泾渭分明.据此,我们不难看出,每个位仅有1.0两种状态,在全部运算后,寻找两种状态的最大结果即可. #include<cstr ...
- C .Adding Powers codeforces(位运算思维)
outputstandard output Suppose you are performing the following algorithm. There is an array v1,v2,-, ...
- 数据结构与算法XS班-左程云第一节课笔记(位运算、算法是什么、简单排序)
第1节 位运算.算法是什么.简单排序 ##这是数据结构与算法新手班-左程云第一节课的笔记## 1. 位运算 // 你们会不会表示一个数字的32位啊? // Java中int类型默认以32位二进制数在计 ...
- [Leedcode][JAVA][第136题][第137题][只出现一次的数字][位运算][HashSet][HashMap]
[问题描述][第136,137题][只出现一次的数字] 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了N次.找出那个只出现了一次的元素.[第136题]N= 2 输入: [2,2 ...
最新文章
- 基于Oracle11gR2 GRID的单实例库备份恢复
- Nagios配置文件上传
- 腾讯、百度、阿里、微软面试题精选(不断更新)
- GridView合并列下的行单元格的方法
- 识别产品外观的合格软件_产品外观质量视觉检测系统.PDF
- 【博士招生】卢森堡大学​SnT(CVI²)研究小组,DeepFake 检测领域
- CentOS网络配置解决方案
- JavaWeb学习笔记
- 通过 百度网盘 分享文件
- 【云周刊】第121期:图管够!灌篮高手、女儿国…阿里日,这帮程序员太会玩了!
- 会员积分系统的四大元素
- 《预告 》 明天(9月19日),中国科学院自动化研究所首届智能决策论坛即将开幕!(附带10+位作者演讲主题及摘要)...
- 强子老师python_强子老师分享:深度分析维生素C
- nginx配置和优化详解
- IOS开发-画曲线画弧线画圆
- 魔兽任务分类及游戏任务系统设计启示
- 【备忘】传智播客ios第五期
- 软件开发中的需求分析
- 半导体分立器件静态参数测试系统 DCT1401 天光测控
- 【githubgirl】自主导航无人机的硬件组成与搭建方案
热门文章
- win10专业版和企业版的区别_Win10专业版和家庭版有什么区别?Win10家庭版和专业版区别对比...
- Secure CRT 用域名连接虚拟机的详细步骤
- Rockchip瑞芯微UART调试指南
- here i am(歌手BryanAdams的歌曲)
- JWT全面解读、详细使用步骤
- 计算机网络带宽是什么意思,带宽是什么有什么意义
- [转]4款手机音乐播放器对比
- android自动修音,唱吧自动一键修音软件-唱吧自动修音app8.8.6 安卓手机版-东坡下载...
- JQuery广告(新闻)浮动(漂浮)框
- 基于SPSS的医疗医保费用数据分析预测(C#)