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

LeetCode —— 只出现一次的数字

只出现一次的数字 I

 本题依靠异或运算符的特性,两个相同数据异或等于0,数字与0异或为本身即可解答。代码如下:

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

 只出现一次的数字 II

 官方使用位运算题解代码如下:

class Solution {
public:int singleNumber(vector<int>& nums) {int ans = 0;for (int i = 0; i < 32; ++i) {int total = 0;for (int num: nums) {total += ((num >> i) & 1);}if (total % 3) {ans |= (1 << i);}}return ans;}
};

为什么可以这样实现呢?博主也是想了好久,现在解释原理:

  1. 若顺序表中的元素个数为奇数,那么一定有 2n 组出现 3 次的数和1个只出现一次的数组成,右移n位,由于出现 3 次的数是偶数个,那么与1进行与运算并相加后,必定为3的倍数,如果模3不等于0,只有一种可能:只出现一次的数为1使total不能被整除,说明只出现一次的数第 i 位为1,反之为0。
  2. 若顺序表中的元素个数为偶数,那么一定有2n + 1组出现三次的数和1个只出现一次的数组成,右移n位,由于出现 3 次的数是奇数个,那么与1进行与运算并相加后,必定为3的倍数,如果模 3 不等于 0 ,只有一种可能:只出现一次的数为1使total不能被整除,说明只出现一次的数第 i 位为1,反之为0。

 只出现一次的数字 III

本人选择了一个较为好理解的答案, 题解大神(灵茶山艾府)使用位运算题解代码如下: 

class Solution {
public:vector<int> singleNumber(vector<int>& nums) {// 负数在计算机是补码的形式存在// 无符号取负数就是取反加一unsigned int x = 0;for (auto e : nums){x ^= e;}int lowbit = x & -x;// 此方法可以算出最低比特位  vector<int> ans(2);for (auto f : nums){ans[(f & lowbit) != 0] ^= f;}return ans;}
};

 看完图之后是否理解得更加深刻了呢?个人觉得第二次遍历相当巧妙,下面看大佬给出的解释:

希望本篇文章对你有帮助,有问题请在评论区指正,感谢阅读。 

http://www.lryc.cn/news/382752.html

相关文章:

  • python遍历文件夹中所有图片
  • 速盾:DDOS能打死高防ip吗?
  • 3dsMax怎样让渲染效果更逼真出色?三套低中高参数设置
  • Android的OverlayFS原理与作用
  • 奇点临近:人类与智能时代的未来
  • NAS教程丨铁威马如何登录 SSH终端?
  • 2024-06-24 百度地图的使用及gps定位坐标获取
  • Python二级考试试题②
  • 安装和使用nvm安装Nodejs
  • 非遗!四川省21市非遗大师工作室申报认定条件程序和认定补贴经费支持(管理办法)
  • uni-app系列:uni.navigateTo传值跳转
  • 6.3万美刀BTC的车还能上吗?
  • 在 Vue 3 中设置 `@` 指向根目录的方法汇总
  • 基于 NXP LS1046 +FPGA系列 CPCI 架构轨道交通专用板卡
  • 快速上手 Spring Boot:基础使用详解
  • react学习——08三点运算符
  • 腾讯云OpenCloudOS系统上安装MySQL
  • C++ - 介绍enum的使用
  • Qt 信号与槽的使用详解 - 多种绑定形式、同步异步、Lambda表达式等
  • Harbor本地仓库搭建002_Harbor负载均衡节点搭建_nginx安装配置_harbor安装---分布式云原生部署架构搭建002
  • 《单元测试之道Java版——使用JUnit》学习笔记汇总
  • 项目实训-vue(十一)
  • 计算机网络-BGP路由负载分担
  • Python爬取中国福彩网彩票数据并以图表形式显示
  • 0621作业
  • ps基础入门
  • c语言常用易错记录
  • 制造业ERP五大生产模式详解!
  • ​Python20 Numpy基础
  • 暴雨虐长沙,生灵受煎熬