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

我爱学算法之—— 位运算(下)

一、只出现一次的数字 II

题目解析

在这里插入图片描述

给定一个数组nums,其中只有一个元素出现了一次,其余的每个元素都出现了三次。

要求找出这个只出现一次的元素,并返回。

算法思路

对于这道题,可以使用hash记录每一个元素出现的次数,然后再找到出现一次的元素并返回。

但是题目题目要求:线性时间复杂度O(n)、常数级空间复杂度O(1)

思路:位运算

这里数组nums中所有的元素都出现了奇数次,这里就不能使用a ^ a = 0a ^ 0 = a来进行获取;

这里,就要关注int(一个数)的每一个bit位;

对于一个bit位,一个数x只出现了一次,其他每一个元素都出现了三次;

这里就只需要将每一个bit位上的数加起来,再对其%3。((3n + x) % 3 = x

无论出现三次的元素该bit位为0还是1,所有元素该bit位的和%3的结果就是只出现一次的元素的该bit位的值。

所以,只需统计nums中所有元素每一个bit位的和,再%3就可获得只出现一次的数该bit位的值。

得到了该数每一个bit位的值,再获取该数然后返回即可。

在这里插入图片描述

代码实现

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

二、消失的两个数字

题目解析

在这里插入图片描述

这道题,给定一个数组,该数组中包含[1 , N]中所有的整数,但是缺少了两个数字。(N-2个)

要我们求出缺失的两位数字;

题目要求:时间复杂度:O(n)、空间复杂度O(1)

算法思路

思路一:

对于这道题,我们可以使用hash表统计nums数组中出现的元素,然后找到没有出现的两个数字然后返回即可。

空间复杂度:O(n)

思路二:

在做这道题之前,如果了解过丢失的数字 和 只出现一次的数字 III就会非常简单;

思路:

  • 异或nums中的所有数和1-N中所有数(除了丢失的两个数字,其他所有数都出现了两次);这样就获得了a^b
  • 根据a^b,获取最低位的1
  • 再将nums中所有数和1-N中所有数分为两组分别进行异或,即可获取ab

在这里插入图片描述

代码实现

class Solution {
public:vector<int> missingTwo(vector<int>& nums) {int n = nums.size();int tmp = 0;for (int i = 0; i < n; i++)tmp ^= nums[i];for (int i = 1; i <= n + 2; i++)tmp ^= i;int lowbit = tmp & (-tmp);int a = 0, b = 0;for (int i = 0; i < n; i++) {if (lowbit & nums[i])a ^= nums[i];elseb ^= nums[i];}for (int i = 1; i <= n + 2; i++) {if (lowbit & i)a ^= i;elseb ^= i;}return {a, b};}
};

本篇文章到这里就结束了,感谢支持
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2oul0hvapjsws

http://www.dtcms.com/a/392152.html

相关文章:

  • LeetCode第364题_加权嵌套序列和II
  • 云计算和云手机之间的关系
  • 胡服骑射对中国传统文化的影响
  • leetcode-hot-100 (多维动态规划)
  • Chromium 138 编译指南 Ubuntu 篇:depot_tools安装与配置(三)
  • 在Ubuntu 16.04上安装openjdk-6/7/8-jdk的步骤
  • 小杰机器学习高级(four)——基于框架的逻辑回归
  • 基于AI分类得视频孪生鹰眼图像三维逆变换矫正算法
  • [Tongyi] 智能代理搜索范式 | 决策->行动->观察(循环迭代)
  • FLink:窗口分配器(Window Assigners)指定窗口的类型
  • GO实战项目:流量统计系统完整实现(Go+XORM+MySQL + 前端)
  • 零基础-动手学深度学习-13.10. 转置卷积
  • 【Math】初三第一、二单元测试卷(测试稿)
  • 2.Spring AI的聊天模型
  • 【连载6】 C# MVC 日志管理最佳实践:归档清理与多目标输出配置
  • autodl平台jupyterLab的使用
  • React学习教程,从入门到精通,React 开发环境与工具详解 —— 语法知识点、使用方法与案例代码(25)
  • 【C++】容器进阶:deque的“双端优势” vs list的“链式灵活” vs vector的“连续高效”
  • llm的ReAct
  • C++ 参数传递方式详解
  • 前端实战开发(一):从参数优化到布局通信的全流程解决方案
  • iOS 层级的生命周期按三部分(App / UIViewController / UIView)
  • 第一章 自然语言处理领域应用
  • GitHub又打不开了?
  • OpenAI回归机器人:想把大模型推向物理世界
  • QML学习笔记(五)QML新手入门其三:通过Row和Colunm进行简单布局
  • 按键检测函数
  • CTFshow系列——PHP特性Web109-112
  • 字符函数与字符串函数
  • 酷9 1.7.3 | 支持自定义添加频道列表,适配VLC播放器内核,首次打开无内置内容,用户可完全自主配置