题目:

给你一个整数数组 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. ECharts 中国地图 vue

    <template> <div> <div id="china_map_box"> <div id="china_map&quo ...

  2. Vue2和ElementUI编写的无限级菜单路由

    Vue2和ElementUI编写的无限级菜单路由 文章转载自:www.javaman.cn <template> <div> <el-menu :default-acti ...

  3. maven问题之Could not calculate build plan:

    问题描述: Could not calculate build plan: Failure to transfer org.apache.maven.plugins:maven-surefire-pl ...

  4. python学习笔记(4):面向对象

    面向对象 定义 class Student(被继承类): def __init__(self, xx, xxx): #构造函数 类方法的第一个参数一定是self.除此之外和普通函数并没有区别.同样可以 ...

  5. B站上传视频时各分辨率最佳的码率及格式参数

    相关链接:表格源文件

  6. C#中的For与Foreach循环:一场性能对话与实战解析

    引言 在C#编程实践中,选择适当的循环结构对程序性能至关重要,尤其是在处理大量数据或追求极致运行效率时.本文将深入探讨C#中的两种主要迭代机制--传统的for循环和基于集合迭代器的foreach循环之 ...

  7. StableSwarmUI:功能强大且易于使用的Stable Diffusion WebUI

    StableSwarmUI是一个模块化和可定制的Stable Diffusion WebUI,最近发布了0.6.1-Beta版本.这个开源项目,托管在GitHub上:https://github.co ...

  8. KingbaseES V8R6 集群运维案例 -- 磁盘空间问题导致集群故障

    某商业银行生产系统KingbaseES读写分离集群主库出现故障,导致集群主备发生切换.客户要求说明具体的原因. KingbaseES读写分离集群基本信息: KingbaseES集群信息   操作系统 ...

  9. KingbaseES运维案例之---服务进程(backend process)终止

    ​ 案例说明: 如下图所示:KingbaseES服务进程结构 KingbaseES使用客户端/服务器的模型. 对于每个客户端的连接,KingbaseES主进程接收到客户端连接后,会为其创建一个新的服务 ...

  10. 鸿蒙HarmonyOS实战-ArkUI组件(List)

    一.List 1.概述 列表是一种非常有用且功能强大的容器,它常用于呈现同类型或多类型数据集合,例如图片.文本.音乐.通讯录.购物清单等.列表对于显示大量内容而不耗费过多空间和内存是非常有帮助的,因为 ...