LeetCode:137. 只出现一次的数字 II

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

说明:

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

示例 1:

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

输出: 3

示例 2:

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

输出: 99

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/single-number-ii

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

方法一:哈希统计

此方法比较直观、简单,但需要使用线性大小的空间。

  • 算法
  1. 第一遍历整数数组,使用哈希表统计每个整数出现的次数
  2. 第二遍遍历哈希表,返回哈希值为1对应的键
  • 代码
int singleNumber(vector<int>& nums) {
unordered_map<int,int> kv;
for(int i=0; i<nums.size(); i++)
kv[nums[i]]++;
for(auto it: kv)
if(it.second==1)
return it.first;
return 0;
}
  • 时空分析
  1. 时间复杂度:两边遍历,复杂度为O(n)
  2. 空间复杂度:使用哈希表,复杂度为O(n)

方法二:按位模三统计比特位上1的个数

模三统计每个比特位上1出现的个数,需要2个比特位。因此,可以使用两个int型整数去统计所有比特位上1的个数。记b[i]为整数的第i个比特位,则b2[i]b1[i]可表示第i个比特位上1出现的个数(模三)。b2[i]b1[i]=b'01'表示该位总计出现3*x+1次1,+1那次即由只出现一次的整数贡献,因此,只出现一次的整数等于b1&~b2。

  • 算法
  1. 初始化:b1=0,b2=0
  2. 迭代整数数组,模三统计数组所有元素所有比特位上1的个数。
  3. 使用式子b1&~b2计算出出现次数为1的整数
  • 代码
int singleNumber(vector<int>& nums) {
int b1=0, b2=0, b3=0;
for(int i=0; i<nums.size(); i++){
//做加法
b2 = nums[i]&b1^b2;
b1 = nums[i]^b1;
//模3
int sign=b1&b2;
b1=b1^sign;
b2=b2^sign;
}
return b1&~b2;
}
  • 时空分析
  1. 时间复杂度:遍历一遍,复杂度为O(n)
  2. 空间复杂度:使用常数个变量,复杂度为O(1)

LeetCode:137. 只出现一次的数字 II的更多相关文章

  1. Leetcode 137. 只出现一次的数字 II - 题解

    Leetcode 137. 只出现一次的数字 II - 题解 137. Single Number II 在线提交: https://leetcode.com/problems/single-numb ...

  2. Java实现 LeetCode 137 只出现一次的数字 II(二)

    137. 只出现一次的数字 II 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空 ...

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

    只出现一次的数字II 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? ...

  4. LeetCode 137. 只出现一次的数字 II(Single Number II)

    题目描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: ...

  5. [LeetCode] 137. 只出现一次的数字 II

    题目链接 : https://leetcode-cn.com/problems/single-number-ii/ 题目描述: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三 ...

  6. 【LeetCode】137. 只出现一次的数字 II(剑指offer 56-II)

    137. 只出现一次的数字 II(剑指offer 56-II) 知识点:哈希表:位运算 题目描述 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 .请你找出并返回 ...

  7. [LeetCode] 137. 只出现一次的数字,其余三次 II ☆☆☆

    描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输 ...

  8. Java实现 LeetCode 137 只出现一次的数字

    public static int singleNumber(int[] nums) { int res = 0; for(int i=0;i<nums.length;i++) res ^= n ...

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

    2021-04-30 LeetCode每日一题 链接:https://leetcode-cn.com/problems/single-number-ii/ 方法1:使用map记录每个数出现的次数,再找 ...

随机推荐

  1. HTML布局排版4三部分测试图片页面

    布局样式有前面的三个相关博文介绍: 该页面因为方便以后自己用,所以JS并没有判断输入内容为空或不对的情况.页面本身特点:1.页头的透明图,方便不更换底层渐变的情况下,更换图片2.浏览器宽度改变,中间b ...

  2. windows下 使用ip地址反查主机名的命令

    nbtstat -a [远端或局域网某计算机的IP地址] 可以查询返回远端或局域网某计算机的主机名 C:\Documents and Settings\z00121596>nbtstat -a ...

  3. centos7下使用yum安装mysql5.7.10

    原文地址:http://www.mamicode.com/info-detail-503994.html CentOS7的yum源中默认好像是没有mysql的.为了解决这个问题,我们要先下载mysql ...

  4. 上传大文件到腾讯云cos遇到的一些问题

    讲一个开发遇到的问题. 开发中遇到一个需求,需要在后台表单页面支持上传视频.因为项目中一直用的是腾讯云的COS做第三方存储平台,所以视频也要上传到cos中保存.首先想到的是使用腾讯提供的php的SDK ...

  5. 使用fiddl模拟弱网

    原文地址:https://www.jianshu.com/p/71c3b4a49930 Fiddler-弱网设置 1.打开fiddler,点击 Rules->Performance-> 勾 ...

  6. 虚拟机中Linux环境下使用Squid部署代理缓存服务(及透明传输)

    小知识: 正确的使用Squid服务程序部署代理缓存服务可以有效提升访问静态资源的效率,降低原服务器的负载. 不仅如此,还为读者们添加了对指定IP地址.网页关键词.网址与文件后缀的ACL访问限制功能的实 ...

  7. 028 Android 旋转动画+病毒查杀效果+自定义样式的ProgressBar

    1.目标效果 旋转动画+病毒查杀效果 2.xml布局文件 (1)activity_kill_virus.xml <?xml version="1.0" encoding=&q ...

  8. ubuntu下安装amqp扩展

    目录 环境 下载扩展: 安装amqp: 验证 环境 系统 ubuntu 16.04 php 7.1 下载扩展: sudo apt-get -y install gcc make autoconf li ...

  9. React项目使用React-Router

    ⒈初始化React项目(略) 请参考 初始化一个React项目(TypeScript环境) ⒉集成React-Router 在React世界里,公认最好用的路由是React-Router.那我们直接来 ...

  10. Java基础---Java 练习题49

    1.分别用do-while和for循环计算1+1/2!+1/3!+…前20项和 /** * 用do-while计算1+1/2!+1/3!+……的前20项的和 * @Hoagn * */ public ...