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

LeetCode题练习与总结:只出现一次的数字Ⅱ--137

一、题目描述

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= nums.length <= 3 * 10^4
  • -2^31 <= nums[i] <= 2^31 - 1
  • nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次

二、解题思路

这个问题是一个典型的位操作问题。由于每个元素都出现了三次,除了一个元素只出现了一次,我们可以考虑每个元素的每一位。如果将所有元素在每个位上累加起来,那么每个位上的和应该是3的倍数。如果有任何位上的和不是3的倍数,那么只出现一次的元素在该位上必须是1。

例如,假设数组是 [2,2,3,2](二进制表示为 [10, 10, 11, 10]):

  • 在第一位(最右边)上,所有数的和是 1+1+1+1 = 4,不是3的倍数,这意味着只出现一次的数的第一位是1。
  • 在第二位上,所有数的和是 0+0+1+0 = 1,不是3的倍数,这意味着只出现一次的数的第二位是1。

所以,只出现一次的数是 11,即 3。

我们可以用这样的方法检查每个位,然后重构出只出现一次的数。

以下是具体的解题步骤:

  1. 初始化一个长度为32的数组(因为一个整数的二进制表示最多有32位)来存储每一位的和。
  2. 遍历数组 nums 中的每个数,对于每个数,检查其二进制表示的每一位,如果是1,则将对应位的和加1。
  3. 遍历完成后,检查每一位的和,如果不是3的倍数,那么只出现一次的数在该位上是1。
  4. 根据这些信息,重构出只出现一次的数。

三、具体代码

class Solution {public int singleNumber(int[] nums) {int[] count = new int[32]; // 32位整数for (int num : nums) {for (int i = 0; i < 32; i++) {count[i] += (num >> i) & 1; // 检查num的第i位是否为1}}int result = 0;for (int i = 0; i < 32; i++) {// 如果count[i]不是3的倍数,那么result的第i位是1result |= (count[i] % 3) << i;}return result;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 遍历数组 nums 中的每个元素是一个 O(n) 操作,其中 n 是数组 nums 的长度。
  • 对于每个元素,我们检查它的每一位,这是一个 O(1) 操作,因为一个整数的位数是固定的,最多为 32 位。
  • 因此,外层循环的时间复杂度是 O(n),内层循环的时间复杂度是 O(1),所以总的时间复杂度是 O(n)。
2. 空间复杂度
  • 我们使用了一个长度为 32 的数组 count 来存储每一位的和,这是一个固定大小的数组,不随输入数组 nums 的大小而变化。
  • 因此,空间复杂度是 O(1),即常数空间复杂度。

综上所述,给定代码的时间复杂度是 O(n),空间复杂度是 O(1)。这满足了题目要求的线性时间复杂度和常数空间复杂度。

五、总结知识点

1. 位操作

  • >>:右移操作符,用于将一个数的二进制表示向右移动指定的位数。例如,num >> i 表示将 num 的二进制表示向右移动 i 位。
  • &:按位与操作符,用于对两个数的二进制表示进行逐位比较,只有两个位都是1时,结果位才是1。在这里,(num >> i) & 1 用于检查 num 的第 i 位是否为1。
  • |:按位或操作符,用于对两个数的二进制表示进行逐位比较,只要有一个位是1,结果位就是1。在这里,result |= (count[i] % 3) << i 用于将 result 的第 i 位设置为1,如果 count[i] % 3 不为0。

2. 数组的初始化和使用

  • int[] count = new int[32];:初始化一个长度为32的整数数组,用于存储每一位的和。

3. 循环结构

  • for (int num : nums):这是Java中的增强型for循环,用于遍历数组 nums 中的每个元素。
  • for (int i = 0; i < 32; i++):这是一个传统的for循环,用于重复执行32次,每次循环处理一个二进制位。

4. 取模运算

  • %:取模运算符,用于计算一个数除以另一个数后的余数。在这里,count[i] % 3 用于检查 count[i] 是否是3的倍数。

5. 位掩码

  • 1 << i:创建一个只在第 i 位上为1的位掩码。这个掩码用于将 count[i] % 3 的结果放到 result 的正确位置上。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

相关文章:

LeetCode题练习与总结:只出现一次的数字Ⅱ--137

一、题目描述 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 示例 1&#xff1a; 输入&#xff1a;n…...

Live Wallpaper Themes 4K Pro for Mac v19.9 超高清4K动态壁纸

Live Wallpaper & Themes 4K Pro for Mac v19.7 是一款专为Mac用户设计的超高清4K动态壁纸应用程序。它凭借出色的视觉效果和丰富的个性化设置&#xff0c;为用户带来全新的桌面体验。 这款软件提供了大量精美的动态壁纸供用户选择&#xff0c;涵盖了各种风格和主题&#…...

vue3+ts:监听dom宽高变化函数

一、效果展示 二、代码 getSize.ts import { ref, Ref, watchEffect } from "vue";export const getWidth (domRef: Ref<HTMLElement | null>) > {const width ref<number>(0);const height ref<number>(0);const observer new ResizeObs…...

数据库浅识及MySQL的二进制安装

数据库基础概念与MySQL二进制安装与初始化 使用数据库的必要性 数据库可以结构化储存大量数据信息&#xff0c;方便用户进行有效的检索访问 有效的保持数据信息的一致性&#xff0c;完整性&#xff0c;降低数据冗余 可以满足应用的共享和安全方面的要求 数据库基本概念 数据…...

机器学习之数学基础(七)~过拟合(over-fitting)和欠拟合(under-fitting)

目录 1. 过拟合与欠拟合 1.1 Preliminary concept 1.2 过拟合 over-fitting 1.3 欠拟合 under-fitting 1.4 案例解析&#xff1a;黑天鹅 1. 过拟合与欠拟合 1.1 Preliminary concept 误差 经验误差&#xff1a;模型对训练集数据的误差。泛化误差&#xff1a;模型对测试…...

⭐最新版!SpringBoot正确集成PageHelper姿势,不再被误导!

GGBond&#x1f508; CSDN的朋友们大家好哇&#xff0c;我是新来的Java练习生 CodeCodeBond&#xff01; 什么是PageHelper&#xff1f; 这里给不知道的人儿说明一下~~ 知道的xdm可以跳过了&#xff01; PageHelper顾名思义是一个 页面 帮手。也就是分页查询的一个好用的工具…...

解决:Xshell通过SSH协议连接Ubuntu服务器报“服务器发送了一个意外的数据包,received:3,expected:20”

下图所示&#xff1a; 日志也基本看不出来问题在哪&#xff0c;只是说断开了连接大概是验证失败。有幸在某论坛评论区找到了原因&#xff0c;是因为我的xshell版本太低了而服务器的ssh版本太高&#xff0c;高版本的ssh默认屏蔽了一部分不太安全的算法导致建立连接的时候验证失败…...

[学习笔记] 禹神:一小时快速上手Electron笔记,附代码

课程地址 禹神&#xff1a;一小时快速上手Electron&#xff0c;前端Electron开发教程_哔哩哔哩_bilibili 笔记地址 https://github.com/sui5yue6/my-electron-app 进程通信 桌面软件 跨平台的桌面应用程序 chromium nodejs native api 流程模型 main主进程 .js文件 node…...

Java stream操作流常用的方式

在Java中&#xff0c;Stream操作流是Java 8新引入的一个功能&#xff0c;它提供了很多强大的操作&#xff0c;方便我们进行集合的处理和操作。常用的Stream操作方式有&#xff1a; 1.过滤&#xff1a;使用filter()方法可以过滤掉集合中不符合条件的元素。 2.映射&#xff1a;…...

【C#】图形图像编程

实验目标和要求&#xff1a; 掌握C#图形绘制基本概念&#xff1b;掌握C#字体处理&#xff1b;能进行C#图形图像综合设计。 运行效果如下所示&#xff1a; 1.功能说明与核心代码 使用panel为画板&#xff0c;完成以下设计内容&#xff1a; 使用pen绘制基础图形&#xff1b;使…...

埃特巴什码加解密小程序

埃特巴什码加解密小程序 这几天在看CTF相关的课程&#xff0c;涉及到古典密码学和近代密码学还有现代密码学。 简单替换密码 Atbash Cipher 埃特巴什码(Atbash Cipher)其实可以视为下面要介绍的简单替换密码的特例&#xff0c;它使用字母表中的最后 一个字母代表第一个字母…...

Golang笔记:使用serial包进行串口通讯

文章目录 目的使用入门总结 目的 串口是非常常用的一种电脑与设备交互的接口。这篇文章将介绍golang中相关功能的使用。 本文使用的包为 &#xff1a;go.bug.st/serial https://pkg.go.dev/go.bug.st/serial https://github.com/bugst/go-serial 另外还有一些常见的包如&…...

EasyExcel 导出批注信息

1. 批注信息 package com.xxx.demo;import lombok.Getter;/*** This class represents the comment information associated with a specific cell in an Excel sheet.* The columnIndex field specifies the column number of the cell, and the comment field stores the te…...

HttpServletRequest・getContentLeng・getContentType区别

getContentLength()&#xff1a; 获取客户端发送到服务器的HTTP请求主体内容的字节数&#xff08;长度&#xff09; 如果请求没有正文内容&#xff08;如GET&#xff09;&#xff0c;或者请求头中没有包含Content-Length字段&#xff0c;则该方法返回 -1 getContentType()&am…...

Matlab|【防骗帖】考虑时空相关性的风电功率预测误差建模与分析

目录 1 主要内容 2 部分程序 3 下载链接 1 主要内容 这个程序《考虑时空相关性的风电功率预测误差建模与分析》画的图片非常漂亮&#xff0c;和原文献基本一致&#xff0c;但是实际上内容并未实现出来&#xff0c;主要就是利用现有的风电预测的数据和结果做了相关的图&#…...

【Android面试八股文】说一说ListView卡顿的原因以及相对应的优化策略

文章目录 一、ListView卡顿的原因1.1 Item没有复用1.2 布局的层级过深1.3 数据绑定逻辑过多1.4 滑动时不必要的图片刷新1.5 频繁的notifyDataSetChanged二、优化策略2.1 使用 ViewHolder 进行视图复用2.2 优化布局结构2.3 优化数据绑定逻辑过多2.4 图片加载优化2.5 避免频繁调用…...

Kotlin 中的内联函数

1 inline 内联函数&#xff1a;消除 Lambda 带来的运行时开销。 举例来说&#xff1a; fun main() {val num1 100val num2 80val result num1AndNum2(num1, num2) { n1, n2 ->n1 n2} }fun num1AndNum2(num1: Int, num2: Int, operation: (Int, Int) -> Int): Int …...

KALI LINUX 开启ssh免登录服务及固定ip及

SSH以进行远程登录 在Kali Linux中启用SSH以进行远程登录,请按照以下步骤操作: 安装SSH服务:sudo apt update sudo apt install openssh-server 已安装可忽略 sudo systemctl start ssh 启动SSH服务 sudo systemctl enable ssh 确保SSH服务设置为开机启动: (可选)如…...

亮数据,一款新的低代码爬虫利器!

在当今数据驱动型时代&#xff0c;数据采集和分析能力算是个人和企业的核心竞争力。然而&#xff0c;手动采集数据耗时费力且效率低下&#xff0c;而且容易被网站封禁。 我之前使用过一个爬虫工具&#xff0c;亮数据&#xff08;Bright Data&#xff09; &#xff0c;是一款低…...

配置OSPF认证(华为)

#交换设备 配置OSPF认证-基于华为路由器 OSPF&#xff08;开放最短路径优先&#xff09;是一种内部网关协议&#xff08;IGP&#xff09;&#xff0c;用于在单一自治系统&#xff08;AS&#xff09;内决策路由。OSPF认证功能是路由器中的一项安全措施&#xff0c;它的主要用途…...

Cinema 4D 2026液体模拟实战:如何用新功能打造逼真水流效果(附参数设置)

Cinema 4D 2026液体模拟实战&#xff1a;如何用新功能打造逼真水流效果&#xff08;附参数设置&#xff09; 在三维动画和特效设计领域&#xff0c;液体模拟一直是技术难度最高、计算资源消耗最大的环节之一。Cinema 4D 2026针对这一核心功能进行了重大升级&#xff0c;特别是改…...

如何用OpenPLC Editor实现工业级控制?3大场景实战指南

如何用OpenPLC Editor实现工业级控制&#xff1f;3大场景实战指南 【免费下载链接】OpenPLC_Editor 项目地址: https://gitcode.com/gh_mirrors/ope/OpenPLC_Editor 你是否曾遇到过工业控制编程的困境&#xff1f;传统PLC开发成本高昂、学习曲线陡峭、兼容性差&#xf…...

无线局域网安全(四)————CCMP加密实战与性能优化

1. CCMP加密的核心原理与AES算法特性 CCMP加密协议作为无线局域网安全的黄金标准&#xff0c;本质上是一套基于AES算法的"安全组合拳"。我常把它比作银行金库的三重门禁系统&#xff1a;第一道门用CTR模式确保数据保密性&#xff0c;第二道门通过CBC-MAC实现完整性校…...

从协作机器人到手术刀:深入拆解阻抗/导纳控制在真实工业与医疗场景下的选型指南

从协作机器人到手术刀&#xff1a;深入拆解阻抗/导纳控制在真实工业与医疗场景下的选型指南 当UR10e协作机器人的机械臂以0.1毫米的重复定位精度在汽车底盘上完成螺栓锁付时&#xff0c;当达芬奇手术机器人的EndoWrist器械在跳动的心脏表面完成微米级血管缝合时&#xff0c;背后…...

Vue项目里给天地图加个‘框’:限制缩放与拖拽区域的完整配置流程(附避坑点)

Vue项目实战&#xff1a;天地图交互边界精准控制与工程化实践 在园区导航、景区导览等业务场景中&#xff0c;地图交互边界的精确控制直接影响用户体验。上周接手一个智慧园区项目时&#xff0c;产品经理指着地图上可以无限拖拽的空白区域问我&#xff1a;"能不能让地图像…...

RHEL 8 部署 Oracle 数据库

目录 一、目标与环境 二、Oracle安装包下载 官方下载地址&#xff08;推荐&#xff09; 三、安装详细步骤 第一阶段&#xff1a;系统准备&#xff08;全部以root用户操作&#xff09; 1. 安装必要的依赖包 2. 创建Oracle用户和组 3. 创建目录结构并设置权限 4. 配置系统…...

从零到一:在Windows系统上部署JDK11与Neo4j 4.3.5开发环境

1. 环境准备&#xff1a;JDK11与Neo4j 4.3.5的版本选择 刚开始接触Java和图数据库时&#xff0c;我踩过不少版本不兼容的坑。比如有一次装了最新版JDK17&#xff0c;结果Neo4j死活启动不了&#xff0c;折腾半天才发现是版本冲突。所以现在每次搭建环境&#xff0c;我都会先确认…...

电机控制进阶:从增量式与位置式PID到现代复合控制策略

1. PID控制的前世今生&#xff1a;从工业革命到智能时代 第一次接触PID控制器时&#xff0c;我被这个诞生于上世纪30年代的"古董级"算法震惊了。当时正在调试一台伺服电机&#xff0c;系统总是出现超调和振荡。导师递给我一张写着三个参数的纸条&#xff1a;"试…...

QLVideo终极指南:三步让Mac视频预览功能全面升级

QLVideo终极指南&#xff1a;三步让Mac视频预览功能全面升级 【免费下载链接】QuickLookVideo This package allows macOS Finder to display thumbnails, static QuickLook previews, cover art and metadata for most types of video files. 项目地址: https://gitcode.com…...

从零部署Jetson Xavier NX:Ubuntu 20.04系统烧录、CUDA环境配置与深度学习框架实战指南

1. 开箱与硬件准备 第一次拿到Jetson Xavier NX开发板时&#xff0c;我差点被它小巧的尺寸骗了——这个巴掌大的板子居然藏着384个CUDA核心和48个Tensor核心。我入手的是带128GB SSD的EMMC版本&#xff0c;实测下来这套配置跑YOLOv5这类中等规模的模型完全够用。开箱清单里除了…...