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

知识点:哈希表;位运算

题目描述

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

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

示例
输入:nums = [2,2,3,2]
输出:3 输入:nums = [0,1,0,1,0,1,99]
输出:99

解法一:HashMap

和136题一样,使用哈希表存储每个数字出现的数字,再遍历哈希表,看谁能等于1;

很容易想到,但这样做的坏处就是需要开辟新的空间;

class Solution {
public int singleNumber(int[] nums) {
Map<Integer,Integer> map = new HashMap<>();
for(Integer i : nums){
map.put(i, map.getOrDefault(i, 0)+1);
}
for(Integer i: map.keySet()){
if(map.get(i) == 1) return i;
}
return -1;
}
}

时间复杂度:O(N);

空间复杂度:O(N);

解法二:位运算

这题不能再用异或去解了,因为变成了三个没有办法抵消,但是想象一下,如果有三个一模一样的数字,那这三个数字二进制相加后,所有位上要么是0;要么全是3的倍数;然后我们的多余元素,要么加上去为0;要么加上去多了一个1,所以可以依次求每位的和,然后%3,如果值为1,那证明我们在这位上的值为1;否则为0;

如下图所示;

class Solution {
public int singleNumber(int[] nums) {
//在java中int类型是32位,我们需要统计所有数字在某一位置的和能不能被3整除,
// 如果不能被3整除,说明那个只出现一次的数字的二进制在那个位置是1……把32位全部统计完为止
int ans = 0;
for(int i = 0; i < 32; i++){
int count = 0; //统计1的个数;
for(int j = 0; j < nums.length; j++){
count += (nums[j] >> i) & 1; //统计所有数在第i位上1的个数;
}
if(count % 3 != 0){
ans = ans | (1 << i); //其他位不变,第i位置为1;
}
}
return ans;
}
}

时间复杂度:O(N);

空间复杂度:O(1);

体会

**掌握位运算的解决方法:这种题目往往要按位与、按位异或等操作;

此外还会有左移<<;右移>>等;比如说:

a & 1 : a的其他位全为0,最后一位不变:即取a最后一位;

a | (1 << i) : a的其他位不变,把a的第i位置为1;

(a >> i) & 1 : 取出a第i位上的值;

【LeetCode】137. 只出现一次的数字 II(剑指offer 56-II)的更多相关文章

  1. 剑指 Offer 56 - II. 数组中数字出现的次数 II + 位运算

    剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Au ...

  2. 剑指 Offer 56 - II. 数组中数字出现的次数 II

    题目描述 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. 示例1: 输入:nums = [3,4,3,3] 输出:4 示例2: 输入:nums = ...

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

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

  4. 剑指 Offer 56 - I. 数组中数字出现的次数 + 分组异或

    剑指 Offer 56 - I. 数组中数字出现的次数 Offer_56_1 题目描述 解题思路 java代码 /** * 方法一:数位方法 */ class Offer_56_1_2 { publi ...

  5. [简单-剑指 Offer 53 - II. 0~n-1中缺失的数字]

    [简单-剑指 Offer 53 - II. 0-n-1中缺失的数字] 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内.在范围0-n-1内的n个数字中有且只有一 ...

  6. 剑指 Offer 53 - II. 0~n-1中缺失的数字 + 二分法

    剑指 Offer 53 - II. 0-n-1中缺失的数字 Offer_53 题目详情 java代码 package com.walegarrett.offer; /** * @Author Wale ...

  7. 力扣 - 剑指 Offer 53 - II. 0~n-1中缺失的数字

    题目 剑指 Offer 53 - II. 0-n-1中缺失的数字 思路1 排序数组找数字使用二分法 通过题目,我们可以得到一个规律: 如果数组的索引值和该位置的值相等,说明还未缺失数字 一旦不相等了, ...

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

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

  9. 数字序列中某一位数字(《剑指offer》面试题44)

    由于这道题目在牛客上没有,所以在此记录一下. 一.题目大意: 数字以0123456789101112131415…的格式序列化到一个字符序列中.在这个序列中,第5位(从0开始计数,即从第0位开始)是5 ...

随机推荐

  1. 英伟达TRTTorch

    英伟达TRTTorch PyTorch JIT的提前(AOT)编译Ahead of Time (AOT) compiling for PyTorch JIT TRTorch是PyTorch / Tor ...

  2. Springboot中以配置类方式自定义Mybatis的配置规则(如开启驼峰映射等)

    什么是自定义Mybatis的配置规则? 答:即原来在mybatis配置文件中中我们配置到<settings>标签中的内容,如下第6-10行内容: 1 <?xml version=&q ...

  3. Pytorch线性规划模型 学习笔记(一)

    Pytorch线性规划模型 学习笔记(一) Pytorch视频学习资料参考:<PyTorch深度学习实践>完结合集 Pytorch搭建神经网络的四大部分 1. 准备数据 Prepare d ...

  4. 使用firefox打开网页报错——Error: no display specified

    想在linux环境下打开一个网页,环境描述:在窗口模式下,打Terminal,然后从本地服务器ssh到了另一个服务器,想执行firefox命令打开一个网页,如下 [root@pc207 ~]# fir ...

  5. ORA-19504: failed to create file "/u01/backup/db_0_20190603_1" ORA-27038: created file already exists

    1.问题:在用rman进行0级备份时,报错: ORA-19504: failed to create file "/u01/backup/db_0_20190603_1"ORA-2 ...

  6. 循序渐进BootstrapVue,开发公司门户网站(4)--- 使用b-carousel-slide组件实现图片轮播以及vue-awesome-swiper实现图片滑动展示

    在BootstrapVue组件库里面,提供了很多对Bootstrap同等类似的组件封装,其中图片轮播可以采用b-carousel-slide组件实现,而有一些小的图片,如客户/合作伙伴Logo或者友情 ...

  7. js判断字符串为空或者为null 简写

    if (str1!== null || str1!== undefined || str1!== '') { var str2= str1; } 下面是简写 var str2= str1|| ''; ...

  8. 将Flink计算完毕后的数据Sink到Nebula

    Flink是目前流计算的隐形王者,在国际国内有有庞大的拥趸. Nebula是国产图数据库的后起之秀,在DBEngines中排名也逐年上升. 将两者进行结合,可以产生很多应用场景:比如实时计算服务链路调 ...

  9. 美化terminal时碰到的问题- Set-Theme

    报错: 1 Set-Theme Set-Theme: The term 'Set-Theme' is not recognized as a name of a cmdlet, function, s ...

  10. CentOS-Docker安装MySQL(单点)

    下载镜像 $ docker pull mysql 创建相关目录和文件 $ mkdir -p /usr/mysql/conf /usr/mysql/data $ chmod -R 755 /usr/my ...