【算法详解】力扣136.只出现一次的数字

一、题目描述

力扣链接:力扣136.只出现一次的数字

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

示例 1 :

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

二、C++题解

2.1 哈希表方法

获取所有元素的哈希表,然后判断出现次数为1的那个即可。

class Solution {
public:int singleNumber(vector<int>& nums) {unordered_map<int, int> countMap;for (auto num : nums) {++countMap[num];}int target = 0;for(auto& entry : countMap) {if (entry.second == 1) {target = entry.first;break;}}return target;}
};

2.2 位运算(异或)

异或运算的两条性质:

  • 一个数和它本身做异或运算结果为 0,即 a ^ a = 0
  • 一个数和 0 做异或运算的结果为它本身,即 a ^ 0 = a

因此,将0与nums中所有元素进行异或运算,最后得到的结果便是只出现一次的数字。

class Solution {
public:int singleNumber(vector<int>& nums) {int result = 0;for (auto num : nums) result ^= num;return result;}
};

三、扩展阅读——位运算

  • 与运算(AND):对两个对应位进行比较,当两个对应位都为1时,结果为1;否则,结果为0。符号为 &

任何数和0做与运算,结果都是0,即 x & 0 = 0。例如,5(101) & 0 = 0。
任何数和其自身做与运算,结果是自身,即 x & x = x。例如,5(101) & 5(101) = 5(101)。

  • 或运算(OR):对两个对应位进行比较,当两个对应位中至少有一个是1时,结果为1;否则,结果为0。符号为 |

任何数和0做或运算,结果是自身,即 x | 0 = x。例如,5(101) | 0 = 5(101)。
任何数和其自身做或运算,结果是自身,即 x | x = x。例如,5(101) | 5(101) = 5(101)。

  • 异或运算(XOR):当两个对应位的值不同时,异或运算的结果为1;当两个对应位的值相同时,异或运算的结果为0。符号为^

任何数和0做异或运算,结果是自身,即 x ^ 0 = x。例如,5(101) ^ 0 = 5(101)。
任何数和其自身做异或运算,结果是0,即 x ^ x = 0。例如,5(101) ^ 5(101) = 0。
异或运算满足交换律和结合律,即 a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c。例如,5(101) ^ 3(011) ^ 4(100) = 5 ^ (3 ^ 4) = (5 ^ 3) ^ 4。

  • 非运算(NOT):对一个二进制数的每一位进行取反,将0变为1,将1变为0。符号为 ~

非运算会反转操作数的所有位。例如,~5(101) = 2(010)。

  • 左移运算(SHL):将一个二进制数的所有位向左移动指定的位数。左移操作会在二进制数的右侧补充相应数量的零。符号为 <<

左移n位等于乘以2的n次方,即 x << n = x * 2^n。例如,5(101) << 2 = 20(10100)。
左移运算不改变操作数的符号位。

  • 逻辑右移运算(SHR):将一个二进制数的所有位向右移动指定的位数。逻辑右移操作会在二进制数的左侧补充相应数量的零。符号为 >>

右移n位等于除以2的n次方,即 x >> n = x / 2^n。例如,20(10100) >> 2 = 5(101)。
逻辑右移运算会用0填充移位后产生的空位。

  • 算术右移运算(SAR):将一个二进制数的所有位向右移动指定的位数,但保持最高位(符号位)不变。算数右移操作会在二进制数的左侧补充相应数量的最高位(符号位)的值。符号为 >>>

算术右移运算会用符号位填充移位后产生的空位,因此它可以保持负数的符号。例如,对于负数-5(1011) >>> 2 = -2(1110)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/634419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt简单使用与初识

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

vue2挂载全局方法/组件

Vue2 挂载全局方法/组件 思路 全局类的功能一般都写在main.js页面&#xff1b; 需求 把自己写的方法挂载到全局&#xff0c;这样每个组件都能使用了&#xff0c;比如下载方法 代码 // common.js 文件// 通用下载方法export function download(url) {window.open(baseURL url…

【汇编】pushf popf

两个指令的作用分别是将16位标志寄存器压入栈、从栈中取出&#xff0c;但是貌似没人做实验验证。 这里做个实验加深理解&#xff0c;顺便总结下几个标志寄存器的作用。 一、结构 8086CPU的flag寄存器的结构如下&#xff1a; OF&#xff1a;判断运算结果是否溢出 CF&#xff1…

web层通用数据处理BaseController

/*** web层通用数据处理* */ public class BaseController {protected final Logger logger LoggerFactory.getLogger(BaseController.class);/*** 将前台传递过来的日期格式的字符串&#xff0c;自动转化为Date类型*/InitBinderpublic void initBinder(WebDataBinder binder)…

HTML Canvas粒子模拟效果

代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>HTML5 Canvas粒子模拟效果DEMO演示</title><style> html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,a…

VUE--组件的生命周期及其基本应用

VUE的生命周期 上图是实例生命周期的图表&#xff0c;需要注意以下几个重要时期&#xff1a; 创建期&#xff1a;beforeCreated、created 挂载期&#xff1a;beforeMount、mounted 更新期&#xff1a;beforeUpdate、updated 销毁期&#xff1a;beforeUnmount、unmounted 生命周…

蓝桥杯真题(Python)每日练Day2

题目 题目分析 对于本题首先确定其数据结构为优先队列&#xff0c;即邮费最小的衣服优先寄&#xff0c;算法符合贪心算法。可以直接使用queue库的PriorityQueue方法实现优先队列。关于PriorityQueue的使用方法主要有&#xff1a; import queue q queue.Queue()# 队列 pq qu…

JAVA实现向Word模板中插入Base64图片和数据信息

目录 需求一、准备模板文件二、引入Poi-tl、Apache POI依赖三、创建实体类&#xff08;用于保存向Word中写入的数据&#xff09;四、实现Service接口五、Controller层实现 需求 在服务端提前准备好Word模板文件&#xff0c;并在用户请求接口时服务端动态获取图片。数据等信息插…

代理IP是什么,代理IP的工作原理是怎么样的?

数字时代&#xff0c;随着数据采集的应用&#xff0c;代理IP也受到越来越多人的关注。但是&#xff0c;很多人对代理IP的具体概念及其工作原理并不是很了解。今天我们就来针对代理IP的相关知识做一个简单的探讨&#xff0c;说说代理IP是什么&#xff0c;它的工作原理又是什么&a…

redis未授权访问全漏洞复现

redis未授权访问全漏洞复现 Redis 有关的漏洞具有明显的时间分段性&#xff0c;在15年11月之前&#xff0c;主要是未授权导致的数据泄露&#xff0c;获得一些账号密码。另外还可以 DoS&#xff08;参考&#xff1a;Sangfor VMP redis unauthorized access vulnerability&#…

VUE--组件通信(非父子)

一、非父子通信 --- event bus 事件总线 作用&#xff1a;非父子组件之间进行简易的消息传递 步骤&#xff1a; 1、创建一个都能访问到的事件总线&#xff08;空vue实例&#xff09;--- utils/EventBus.js import Vue from vue export default new Vue({}) 2、 接收方&…

mysql数据库:迁移数据目录至另一台服务器步骤

一、概述 最近由于项目需要&#xff0c;我们需要进行数据库服务器的更换和迁移工作。迁移计划和步骤如下&#xff1a; 1、首先&#xff0c;在新的数据库服务器上进行环境的搭建和配置&#xff0c;确保数据库版本、配置等一致。 2、然后&#xff0c;将备份的数据库数据导入到…

元注解meta-annotation

DK1.5在java.lang.annotation包定义了4个标准的meta-annotation类型&#xff0c;它们被用来提供对其它 annotation类型作说明。 &#xff08;1&#xff09;Target&#xff1a;用于描述注解的使用范围 可以通过枚举类型ElementType的10个常量对象来指定 TYPE&#xff0c;METHO…

SpringBoot整合SSE

目录 1.SseController2. SseServiceSseServiceSseServiceImpl 3.SendMessageTask4.将定时任务加入启动类5.参考资料 1.SseController Slf4j RestController RequestMapping("sse") public class SseController {Autowiredprivate SseService sseService;RequestMappi…

【算法练习】leetcode算法题合集之二分查找篇

二分查找 LeetCode69.x的平方根 LeetCode69.x的平方根 只要小于等于就可以满足条件了。 class Solution {public int mySqrt(int x) {int left 0, right x;int ans -1;while (left < right) {int mid (right - left) / 2 left;if ((long) mid * mid < x) {ans mi…

为 OpenCV 编写文档(二)

常用命令 这里通过简短的示例描述了最常用的 doxygen 命令。有关可用命令的完整列表和详细说明&#xff0c;请访问命令参考。 基本命令 brief - 带有简要实体描述的段落 param - 函数参数的描述。 多个相邻语句合并到一个列表中。如果在实际函数签名中找不到具有此名称的参数…

寒假冬令营(算法编程)1月17日(二分)

题目描述&#xff08;一&#xff09; 35. 搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: …

2024潮乎新年盲盒H5版本可易支付对接

前端三十行和三十一行改成你域名 后台.env文件修改数据库 下载地址&#xff1a;YISHEN源码网

驾驭车联网的力量:深入车联网网络架构

车联网&#xff0c;作为移动互联网之后的新风口&#xff0c;以网联思想重新定义汽车&#xff0c;将其从简单的出行工具演化为个人的第二空间。车联网涵盖智能座舱和自动驾驶两大方向&#xff0c;构建在网联基础上&#xff0c;犀思云多年深度赋能汽车行业&#xff0c;本文将从车…

122 解二叉树的右视图的两种方式

问题描述&#xff1a;给定一颗二叉树&#xff0c;想想自己站在他的右侧&#xff0c;按照从底部到底部的顺序&#xff0c;饭后从右侧所能看到的节点值。 BFS方式求解&#xff0c;每一层只保留最后一个节点即可。 public List<TreeNode>rightView(TreeNode root) { List&…