剑指offer004(Java)-只出现一次的数字(中等)
题目:
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
示例1:
输入:nums = [2,2,3,2]
输出:3
示例 2:
输入:nums = [0,1,0,1,0,1,100]
输出:100
提示:
1 <= nums.length <= 3 * 104
-231 <= nums[i] <= 231 - 1
nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次
进阶:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
注意:本题与 力扣 137 题相同:
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/WGki4K
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
方法一:位运算
利用int类型固定为32位,利用这32位来统计每一个数值的每一位出现1的次数,然后再对每一位统计出的次数与3进行模运算(如果出现3次,那模运算一定为0),模运算不为0时,就让1向右移动,再与结果进行或运算。
举个例子:[1,1,1,3],1的二进制为 :0001, 3的二进制为:0011
1: 0 0 0 1
1: 0 0 0 1
1: 0 0 0 1
1: 0 0 1 1
c: 0 0 1 4
当count =4时,count % 3 != 0,res |= (1 << 0) = 0000 | 0001 = 0001
当count = 1时, count % 3 != 0,res |= (1 << 1) = 0001 | 0010 = 0011
当count = 0时, count % 3 = 0,不更新res
...(后面的位都不更新res)
结束时res = 0011 = 3
图片来源:K神老师

代码:
1 class Solution {
2 public int singleNumber(int[] nums) {
3 int res = 0;
4 //数组中的元素都在int(即 32 位整数)范围
5 //第一个循环 i从 0~31 ,代表每一位2进制数
6 for (int i = 0; i < 32; i++){
7 int count = 0;
8 for(int num : nums){
9 // num >> i表示num右移i位置,即把二进制第i位右移到最右边
10 // & 1右移之后与1进行&运算,即得到最右边的数
11 //(num >> i) & 1 举例:num为5,i为2,num二进制为 0101,num>>2&1 = 0001 & 1 = 0001 = 1
12 count += ((num >> i) & 1);
13 }
14 //count为nums数字中所有数的二进制第i位的和
15 //count%3!=0:目标答案 二进制的第i位为1
16 if (count % 3 != 0){
17 // 1 << i,将1左移i位,例如i为2,1 << i得到二进制数:100
18 // 将1左移i位之后,与ans即目标答案进行 | 运算(或运算)
19 // 或 运算的目的就是把 第i位的这个1加到ans里
20 //例如:res = 0 |= 0010 = 0010
21 //继续:res = 0010 |= 0001 = 0011 = 3
22 res |= (1 << i);
23 }
24 }
25 return res;
26 }
27 }
方法二:哈希表但空间复杂度和时间复杂度均为O(n)
1 class Solution {
2 public int singleNumber(int[] nums) {
3 HashMap<Integer, Integer> map = new HashMap<>();
4 for(int num : nums){
5 map.put(num, map.getOrDefault(num, 0) + 1);
6 }
7 for (int num : map.keySet()){
8 if (map.get(num) == 1) return num;
9 }
10 return -1;
11 }
12 }
剑指offer004(Java)-只出现一次的数字(中等)的更多相关文章
- 剑指Offer——Java实现栈和队列的互模拟操作
剑指Offer--Java实现栈和队列的互模拟操作 栈模拟队列 题目:JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型. 思路:其实就是把队列正常入 ...
- 牛客网剑指offer java 全部题解
经过数月的努力,终于更完了牛客网的66道剑指offer,以下的顺序和大家在牛客网的顺序是一样的(排序也花了不少时间),希望对大家找工作/提高算法能力能起到些许帮助. 每天一道剑指offer-二维数组中 ...
- 剑指offer35题:第一个只出现一次的字符+剑指offer55题:字符流中第一个不重复的字符+剑指offer51题:数组中重复的数字
在看剑指offer的时候,感觉这三个题目很像,都是用哈希表可以解决,所以把这三个题整理出来,以供复习. 剑指offer35题:第一个只出现一次的字符 题目描述:在字符串中找出第一个只出现一次的字符.如 ...
- 【Java面试真题】剑指Offer53.2——0~n-1中缺失的数字(异或、二分两种解法)
[Java实现]剑指Offer53.2--0~n-1中缺失的数字:面试真题,两种思路分享 前面有另一道面试题[Java实现]剑指offer53.1--在排序数组中查找数字(LeetCode34:在排序 ...
- 《剑指offer》旋转数组中的最小数字
本题来自<剑指offer> 旋转数组中的最小数字 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例 ...
- 剑指 Offer 62. 圆圈中最后剩下的数字 + 约瑟夫环问题
剑指 Offer 62. 圆圈中最后剩下的数字 Offer_62 题目描述 方法一:使用链表模拟 这种方法是暴力方法,时间复杂度为O(nm),在本题中数据量过大会超时. 方法二:递归方法 packag ...
- 【剑指Offer】旋转数组中的最小数字 解题报告(Python)
[剑指Offer]旋转数组中的最小数字 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-intervie ...
- 【Java】 剑指offer(62) 圆圈中最后剩下的数字
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 0, 1, …, n-1这n个数字排成一个圆圈,从数字0开始每 ...
- 【Java实现】剑指offer53.1——在排序数组中查找数字(LeetCode34:在排序数组中查找元素的起始位置)
序数组中查找元素的起始位置):思路分享 <剑指offer>题目和LeetCode主站本质是一样的,想要找到target数目,也需要找到左右边界 题目解析: 在一个排序数组中,找到targe ...
- 剑指offer计划19( 搜索与回溯算法中等)---java
1.1.题目1 剑指 Offer 64. 求1+2+-+n 1.2.解法 这题看评论区真的绝了,都是人才,各个说话都好听,我看到个还有用异常来结束的就离谱. 这题用了&&当左边为fal ...
随机推荐
- 软件发布时 生成发布日志文件 单点登录 getGitInfo.bat
需求 每次发包的时候,前端是3个包,如果后期出现问题,不好回查 所以把当前项目的git信息记录下来 以便回查 第一次手动写了下,发现比较麻烦,所以写个脚本,每次发布的时候 运行下即可 上代码 软件发布 ...
- SecureCRT windows 登录 linux
SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件.SecureCRT支持SSH,同时支持Telnet和rlog ...
- 微型MPU6050模块及串口/BLE透传的实物展示
前言 随着时间的积累,项目的沉淀.把很多做过的产品标准化掉,形成可以立即拿出来使用的产品.是非常重要的一个环节.最近,把基于MPU6050的模块微型化并使用串口透传这个产品梳理了一下.形成了标准化 ...
- spring boot2集成api文档工具swagger-ui(上)
说明 第一步:创建项目 浏览器打开:https://start.spring.io/,生成一个spring boot项目 点击Generate这个按钮,下载项目包文件 第二步:导入开发工具 打开下载目 ...
- 云化XR,如何助力产业升级
XR(Extended Reality)是指借助计算机图形技术和可穿戴设备所生成的一个真实与虚拟组合的.可人机交互的环境.XR中的"X"只是一个变量,可以代表任何字母,包括VR(V ...
- 地理探测器R语言实现:geodetector
本文介绍基于R语言中的geodetector包,依据多张栅格图像数据,实现地理探测器(Geodetector)操作的详细方法. 需要说明的是,在R语言中进行地理探测器操作,可以分别通过geod ...
- Android打造万能自定义阴影控件
目录介绍 01.阴影效果有哪些实现方式 02.实现阴影效果Api 03.设置阴影需要注意哪些 04.常见Shape实现阴影效果 05.自定义阴影效果控件 06.如何使用该阴影控件 07.在recycl ...
- Asp-Net-Core开发笔记:实现动态审计日志功能
前言 最近一直在写 Go 和 Python ,好久没写 C# ,重新回来写 C# 代码时竟有一种亲切感~ 说回正题. 在当今这个数字化迅速发展的时代,每一个操作都可能对业务产生深远的影响,无论是对数据 ...
- CMake使用Boost
cmake_minimum_required(VERSION 2.8) set(Boost_INCLUDE_DIR /usr/local/src/boost_1_46_1) set(Boost_LIB ...
- .NET Emit 入门教程:第四部分:构建类型(Type)
前言: 在动态生成代码的过程中,构建类型(Type)是至关重要的一步. 通过使用 Emit 中的 TypeBuilder,我们可以定义和创建各种类型,包括类.结构体和接口. 本节将深入探讨如何使用 T ...