当前位置: 首页 > news >正文

【技巧】Leetcode 137. 只出现一次的数字 II【中等】

只出现一次的数字 II

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

你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。

示例 1:

输入:nums = [2,2,3,2]
输出:3

示例 2:

输入:nums = [0,1,0,1,0,1,99]
输出:99

解题思路

要找到一个整数数组中唯一出现一次的元素,其余元素都出现三次,我们可以使用位操作的方法。 这种方法利用了数字在计算机中是以二进制形式存储的特性,通过统计每一位上出现1的次数来解决这个问题。

  • 使用32位整数来表示所有的数字。对于每一位,统计所有数字在这一位上出现1的次数。
  • 由于其余每个元素都出现三次,如果某一位上1出现的次数不是3的倍数,那么那个只出现一次的数字在这一位上必然是1。

Java实现

public class SingleNumberII {public int singleNumber(int[] nums) {int[] bitCount = new int[32];// 统计每一位上1的出现次数for (int num : nums) {for (int i = 0; i < 32; i++) {
//                (num & (1 << i)) 的含义
//                1 << i 将数字 1 的二进制表示左移 i 位,结果是一个只有第 i 位为1,其余位为0的数字。例如,1 << 2 的结果是 0100。
//                (num & (1 << i)) 将 num 与这个只有第 i 位为1的数字进行与操作。这样我们就可以检查 num 在第 i 位是否为1。
//                如果结果不为0,说明 num 在第 i 位是1;否则为0。if ((num & (1 << i)) != 0) {bitCount[i]++;}}}int result = 0;for (int i = 0; i < 32; i++) {if (bitCount[i] % 3 != 0) {//还原数字,result | (1 << i) 将 result 的第 i 位设置为1(其他位保持不变)。result |= (1 << i);}}return result;}// 测试用例public static void main(String[] args) {SingleNumberII solution = new SingleNumberII();int[] nums1 = {2, 2, 3, 2};int[] nums2 = {0, 1, 0, 1, 0, 1, 99};System.out.println(solution.singleNumber(nums1)); // 期望输出: 3System.out.println(solution.singleNumber(nums2)); // 期望输出: 99}
}

时间空间复杂度

  • 时间复杂度:O(n),其中 n 是数组的长度。需要遍历数组每个数字,并对其32位进行统计。
  • 空间复杂度:O(1),虽然使用了一个长度为32的数组 bitCount,但它是常数级的,不随输入规模变化而变化。

相关文章:

  • 单元测试很难么?
  • 在线编程工具
  • matlab线性多部法求常微分方程数值解
  • 龙芯LS2K0300久久派上手体验
  • 详解 HBase 的安装部署及命令行操作
  • 2024前端面试准备5-React相关
  • C++ 网络套接字编程 tcp udp
  • 金鸣识别系统:PDF转Excel的高效利器
  • 前端:鼠标点击实现高亮特效
  • 网络层 IP协议【计算机网络】【协议格式 || 分片 || 网段划分 || 子网掩码】
  • Linux-curl命令详解
  • Mac 使用 Homebrew 安装 Python3
  • nvm安装和使用,windows
  • Perl语言入门学习
  • 进阶篇06——锁
  • 〔开发系列〕一次关于小程序开发的深度总结
  • android 一些 utils
  • axios 和 cookie 的那些事
  • CSS 专业技巧
  • css的样式优先级
  • ES6核心特性
  • extjs4学习之配置
  • JavaScript 奇技淫巧
  • Python3爬取英雄联盟英雄皮肤大图
  • python大佬养成计划----difflib模块
  • 今年的LC3大会没了?
  • 少走弯路,给Java 1~5 年程序员的建议
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 微服务核心架构梳理
  • 原生js练习题---第五课
  • MPAndroidChart 教程:Y轴 YAxis
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • #Ubuntu(修改root信息)
  • #VERDI# 关于如何查看FSM状态机的方法
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (2)Java 简介
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (31)对象的克隆
  • (a /b)*c的值
  • (JS基础)String 类型
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (第61天)多租户架构(CDB/PDB)
  • (接口自动化)Python3操作MySQL数据库
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (转)ORM
  • *上位机的定义
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .net mvc 获取url中controller和action
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [AutoSar]BSW_Com02 PDU详解
  • [C++][opencv]基于opencv实现photoshop算法可选颜色调整
  • [C++初阶]list的模拟实现