题目:

给你一个整数数组 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)-只出现一次的数字(中等)的更多相关文章

  1. 剑指Offer——Java实现栈和队列的互模拟操作

    剑指Offer--Java实现栈和队列的互模拟操作 栈模拟队列   题目:JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型.   思路:其实就是把队列正常入 ...

  2. 牛客网剑指offer java 全部题解

    经过数月的努力,终于更完了牛客网的66道剑指offer,以下的顺序和大家在牛客网的顺序是一样的(排序也花了不少时间),希望对大家找工作/提高算法能力能起到些许帮助. 每天一道剑指offer-二维数组中 ...

  3. 剑指offer35题:第一个只出现一次的字符+剑指offer55题:字符流中第一个不重复的字符+剑指offer51题:数组中重复的数字

    在看剑指offer的时候,感觉这三个题目很像,都是用哈希表可以解决,所以把这三个题整理出来,以供复习. 剑指offer35题:第一个只出现一次的字符 题目描述:在字符串中找出第一个只出现一次的字符.如 ...

  4. 【Java面试真题】剑指Offer53.2——0~n-1中缺失的数字(异或、二分两种解法)

    [Java实现]剑指Offer53.2--0~n-1中缺失的数字:面试真题,两种思路分享 前面有另一道面试题[Java实现]剑指offer53.1--在排序数组中查找数字(LeetCode34:在排序 ...

  5. 《剑指offer》旋转数组中的最小数字

    本题来自<剑指offer> 旋转数组中的最小数字 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例 ...

  6. 剑指 Offer 62. 圆圈中最后剩下的数字 + 约瑟夫环问题

    剑指 Offer 62. 圆圈中最后剩下的数字 Offer_62 题目描述 方法一:使用链表模拟 这种方法是暴力方法,时间复杂度为O(nm),在本题中数据量过大会超时. 方法二:递归方法 packag ...

  7. 【剑指Offer】旋转数组中的最小数字 解题报告(Python)

    [剑指Offer]旋转数组中的最小数字 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-intervie ...

  8. 【Java】 剑指offer(62) 圆圈中最后剩下的数字

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 0, 1, …, n-1这n个数字排成一个圆圈,从数字0开始每 ...

  9. 【Java实现】剑指offer53.1——在排序数组中查找数字(LeetCode34:在排序数组中查找元素的起始位置)

    序数组中查找元素的起始位置):思路分享 <剑指offer>题目和LeetCode主站本质是一样的,想要找到target数目,也需要找到左右边界 题目解析: 在一个排序数组中,找到targe ...

  10. 剑指offer计划19( 搜索与回溯算法中等)---java

    1.1.题目1 剑指 Offer 64. 求1+2+-+n 1.2.解法 这题看评论区真的绝了,都是人才,各个说话都好听,我看到个还有用异常来结束的就离谱. 这题用了&&当左边为fal ...

随机推荐

  1. react中css里面 class中的 图片的相对地址 完美解决 backgroundImage

    发现问题:缓存 之前react的图片,也在style里面,也无所谓. 刚做了一个输入框,change的时候改变图片,每次都刷新图片,关键是没缓存,这哪受得了 之前用的: 网上搜索各种插件,替换什么的, ...

  2. springboot如何优雅的获取前端参数

    写在前面 对于初学者来说,困难的不是理论知识,而是如何在程序中具体实现. 现在的项目基本上都是前后端分离的项目,如何打通前后端,接收前端传过来的参数呢? 废话不多说,这篇文章就来说一说接收前端参数的具 ...

  3. 记录--Cesium+Vue实战教程——地图导航

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 项目效果 我们今天要实现的是一个路径规划的功能,有两个输入框.输入起点终点,然后查询,得到规划的路径,效果如下: 我们会用到以下库: Ax ...

  4. FFmpeg开发笔记(四)FFmpeg的动态链接库介绍

    FFmpeg不仅提供了ffmpeg.ffplay和ffprobe三个可执行程序,还提供了八个工具库,使得开发者能够调用库里面的函数,从而实现更精准的定制化开发需求.这八个库的名字是avcodec.av ...

  5. 百度文库内容复制 C# webbrowser+Nsoup

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. QT数据库学习笔记

    简介 QT通过模块化管理,对于某种模块需要添加对应的模块实现.QT SQL也是需要增加对应的模块来实现.QT数据库的层次关系为: 驱动层:数据库到SQL语言之间的桥梁 SQL API层: SQL语句的 ...

  7. 鸿蒙HarmonyOS实战-ArkUI组件(Swiper)

    一.Swiper 1.概述 Swiper可以实现手机.平板等移动端设备上的图片轮播效果,支持无缝轮播.自动播放.响应式布局等功能.Swiper轮播图具有使用简单.样式可定制.功能丰富.兼容性好等优点, ...

  8. 慢查询SQL排查

    转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/c56bd0c5.html 你好,我是测试蔡坨坨. 在往期文章中,我们聊过数据库基础知识,可参考「数据库基础,看完这篇就够了! ...

  9. #阶梯NIM,树形dp#CF1498F Christmas Game

    题目 Alice 和 Bob 在一棵 \(n\) 个点的树上玩游戏,第 \(i\) 个节点上有 \(a_i\) 个石子, 每轮可以选择一个深度至少为 \(k\) 的节点并移动任意多石子到其 \(k\) ...

  10. #容斥,排列组合#U138404 选数字

    题目 给定长度为\(n,n\leq 10^5\)的序列\(a,a_i,m\leq 255\),多组询问求 \[\sum_{i=l}^{r-2}\sum_{j=i+1}^{r-1}\sum_{k=j+1 ...