C++ 位运算OJ

目录

1、 191. 位1的个数

2、 338. 比特位计数

3、 461. 汉明距离

 4、136. 只出现一次的数字

5、 260. 只出现一次的数字 III

6、面试题 01.01. 判定字符是否唯一

7、 268. 丢失的数字

8、 371. 两整数之和

9、 137. 只出现一次的数字 II

10、面试题 17.19. 消失的两个数字


1.位运算常用操作:

  • << 二进制左移一位
  • >> 二进制右移一位
  • ~   按位取反
  • &   有0则0
  • |     有1则1
  • ^     相同为0,相异为1,无进位相加

2.给一个数n,确定它的二进制表示中的第x位是0还是1

  • (n>>x)&1或者n&(1<<x)

3.将一个数n的二进制表示的第x位修改成1

  • n|=(1<<x)

4.将一个数n的二进制表示的第x位修改成0

  • n&=(~(1<<x))

5.位图的思想

  • 例如:使用整形变量int的每一个二进制位进行记录

6.提取一个数(n)二进制表示中最右侧的1

  • n&-n

7.干掉一个数(n)二进制表示中最右侧的1

  • n&(n-1)

8.位运算的优先级

  • 加括号解决

9.异或(^)运算的运算律

  • a^a=0
  • a^0=a
  • a^b^c=a^(b^c)
     

1、 191. 位1的个数

思路:干掉一个数(n)二进制表示中最右侧的1

  • n&=(n-1)
class Solution {
public:int hammingWeight(uint32_t n) {int ret = 0;while (n) {n &= (n - 1);ret++;}return ret;}
};

2、 338. 比特位计数

 

class Solution {
public:vector<int> countBits(int n) {vector<int> a(n+1);for (int i = 0; i <= n; i++) {int ret = 0;int n = i;while (n) {n &= (n - 1);ret++;}a[i]=ret;}return a;}
};

3、 461. 汉明距离

思路:干掉一个数(n)二进制表示中最右侧的1

  • n&=(n-1)
class Solution {
public:int hammingDistance(int x, int y) {int n = x ^ y;int count = 0;while (n) {n &= (n - 1);count++;}return count;}
};

 4、136. 只出现一次的数字

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

5、 260. 只出现一次的数字 III

class Solution {
public:vector<int> singleNumber(vector<int>& nums) {int sum = 0;for (int num : nums) {sum ^= num;}// 防止溢出int l = (sum == INT_MIN ? sum : sum & (-sum));int num1 = 0, num2 = 0;for (int num : nums) {if (num & l)num1 ^= num;elsenum2 ^= num;}return {num1, num2};}
};
  • 首先,sum 是通过对数组中的所有元素进行异或操作得到的。由于其他元素都出现了两次,所以异或操作会将相同的元素抵消掉,最终得到的结果就是只出现一次的两个元素的异或值。

  • sum & (-sum) 的作用是获取 sum 的最低位的 1 所对应的值。-sum 是 sum 的补码的负数,它的二进制表示中只有最低位的 1 是相同的,其他位都是相反的。通过与操作 sum & (-sum),可以将 sum 的二进制表示中除了最低位的 1 以外的其他位都置为 0,得到的结果就是最低位的 1 所对应的值。

这样,l 就表示了只出现一次的两个元素在最低位的不同之处。在后续的循环中,根据每个元素的最低位是否与 l 相同,将元素分为两组,分别进行异或操作,最终得到的 num1 和 num2 就是只出现一次的两个元素。

需要注意的是,由于 INT_MIN 的二进制表示中只有最高位是 1,其他位都是 0,所以在计算 l 的时候需要特殊处理 sum == INT_MIN 的情况,因为 -INT_MIN 会导致溢出,以确保最低位的 1 能够正确地被提取出来。

INT_MIN 的二进制形式是一个以 1 开头,后面跟着 31 个 0 的二进制数。在大多数平台上,INT_MIN 的二进制表示为:

10000000000000000000000000000000

这是一个带符号的 32 位整数,最高位为 1,表示负数,其余位为 0。这是 int 类型能够表示的最小值。

6、面试题 01.01. 判定字符是否唯一

 

思路:位图思想,int类型变量有32个比特位,选取26个比特位记录字母判断是否每个字母只出现一次。 

class Solution {
public:bool isUnique(string astr) {if (astr.size() > 26)return false;int bitmap = 0;for (auto s : astr) {int i = s - 'a';if ((bitmap >> i) & 1 == 1)return false;elsebitmap |= (1 << i);}return true;}
};

7、 268. 丢失的数字

 思路:两次异或

class Solution {
public:int missingNumber(vector<int>& nums) {int ret = 0;for (auto x : nums)ret ^= x;for (int i = 0; i <= nums.size(); i++)ret ^= i;return ret;}
};

8、 371. 两整数之和

class Solution {
public:int getSum(int a, int b) {while (b != 0) {int ret = a ^ b;unsigned int carry = (unsigned int)(a & b) << 1;a = ret;b = carry;}return a;}
};

9、 137. 只出现一次的数字 II

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

10、面试题 17.19. 消失的两个数字

class Solution {
public:vector<int> missingTwo(vector<int>& nums) {int tmp = 0;for (auto x : nums) {tmp ^= x;}for (int i = 1; i <= nums.size() + 2; i++) {tmp ^= i;}int d = 0;while (((tmp >> d) & 1) != 1) {d++;}int a = 0, b = 0;for (auto x : nums) {if (((x >> d) & 1) == 1)a ^= x;elseb ^= x;}for (int i = 1; i <= nums.size() + 2; i++) {if (((i >> d) & 1) == 1)a ^= i;elseb ^= i;}return {a, b};}
};

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

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

相关文章

【C++】二叉树进阶面试题(上)

目录 1. 二叉树创建字符串 题目 分析 代码 2. 二叉树的分层遍历1 题目 分析 代码 3. 二叉树的分层遍历2 题目 分析 代码 4. 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先 题目 分析 代码 5. 二叉树搜索树转换成排序双向链表 题目 分析 代码 1. …

使用GitHub API 查询开源项目信息

一、GitHub API介绍 GitHub API 是一组 RESTful API 接口&#xff0c;用于与 GitHub 平台进行交互。通过使用 GitHub API&#xff0c;开发人员可以访问和操作 GitHub 平台上的各种资源&#xff0c;如仓库、提交记录、问题等。 GitHub API 提供了多种功能和端点&#xff0c;以…

昇腾芯片解析:华为自主研发的人工智能处理器全面分析

在当今科技发展的浪潮中&#xff0c;昇腾芯片作为一种新兴的处理器&#xff0c;正引起广泛的关注和讨论。升腾芯片究竟是由哪家公司生产的&#xff1f;这个问题一直困扰着许多人。下面小编将全面介绍、分析升腾芯片的生产商及各类参数、应用&#xff0c;以便读者对其有更全面的…

Day26-进程管理核心知识2

Day26-进程管理核心知识2 1. top选项介绍2. 进程的三个杀手。2.1 kill2.2 killall 通过进程名字 kill processes by name2.3 pkill 通过进程名称(完整名称) 3. screen命令4. 什么是进程优先级&#xff1f;5. strace&#xff1a;跟踪进程的系统调用 * 1. top选项介绍 【语法格式…

【C++】函数入参 值传递和引用传递,与C语言的区别

在 C 中&#xff0c;函数的参数传递有值传递和引用传递两种方式。当函数的参数是 vector 类型时&#xff0c;可以选择使用 vector 或 vector& 作为参数类型&#xff0c;两者各有优劣&#xff1a; vector vect1&#xff1a;这种方式使用了值传递&#xff0c;即在函数调用时…

自学高效备考2025年AMC8数学竞赛:2000-2024年AMC8真题解析

今天继续来随机看五道AMC8的真题和解析&#xff0c;根据实践经验&#xff0c;对于想了解或者加AMC8美国数学竞赛的孩子来说&#xff0c;吃透AMC8历年真题是备考最科学、最有效的方法之一。即使不参加AMC8竞赛&#xff0c;吃透了历年真题600道和背后的知识体系&#xff0c;那么小…

Dism修复Windows出错(错误代码0x800f081f,找不到源文件)的解决方法

一、环境 系统&#xff1a;Windows 10 二、Dism修复步骤 注&#xff1a;以下操作都需要管理员权限。修复过程需要联网。 2.1 dism扫描全部系统文件 DISM /Online /Cleanup-image /Scanhealth如果结果是“未检测到组件存储损坏 ”&#xff0c;说明完好&#xff0c;可以退出…

Maven终端命令生成Spring-boot项目并输出“helloworld“

1. 生成项目 mvn archetype:generate填写groupId和artifactId&#xff0c;其余默认即可 2. 修改pom.xml文件 将如下内容放入pom.xml文件内 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artif…

Conda笔记--移动Conda环境后pip使用异常的解决

1--概述 由于各种原因&#xff0c;需要将Anaconda转变为Minicoda&#xff0c;为了保留之前安装的所有环境&#xff0c;直接将anaconda3/envs的所有环境拷贝到Miniconda/envs中&#xff0c;但在使用移动后环境时会出现pip的错误&#xff1a;bad interpreter: No such file or di…

计算机网络-物理层-传输媒体

传输媒体的分类 导向型-同轴电缆 导向型-双绞线 导向型-光纤 非导向型

面试问答总结之Java进阶

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;注解Annotaion &#xff08;java标注&#xff09;&#x1f415;内置注解&#x1f415;元注解 &#x1f380;对象克隆&#x1f415;如何实现克隆&#x1f415;如何实现深克…

Vue3教程

1.1 配置环境 vue官网&#xff1a; Vue.js - The Progressive JavaScript Framework | Vue.js 终端 Linux和Mac上可以用自带的终端。 Windows上推荐用powershell或者cmd。Git Bash有些指令不兼容。 安装Nodejs 安装地址&#xff1a; Node.js 安装vue/cli 打开Git Bash&#x…

C#,最小代价多边形三角剖分MCPT(Minimum Cost Polygon Triangulation)算法与源代码

1 最小代价多边形三角剖分算法 凸多边形的三角剖分是通过在非相邻顶点&#xff08;角点&#xff09;之间绘制对角线来形成的&#xff0c;这样对角线就不会相交。问题是如何以最小的代价找到三角剖分的代价。三角剖分的代价是其组成三角形的权重之和。每个三角形的重量是其周长…

293.【华为OD机试】剩余银饰的重量(模拟和贪心算法JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目二.解题思路三.题解代码Python题解代码JAVA题解…

LLM春招准备(1)

llm排序 GPT4V GPT-4V可以很好地理解直接绘制在图像上的视觉指示。它可以直接识别叠加在图像上的不同类型的视觉标记作为指针&#xff0c;例如圆形、方框和手绘&#xff08;见下图&#xff09;。虽然GPT-4V能够直接理解坐标&#xff0c;但相比于仅文本坐标&#xff0c;GPT-4V在…

蓝桥杯练习题——dp

五部曲&#xff08;代码随想录&#xff09; 1.确定 dp 数组以及下标含义 2.确定递推公式 3.确定 dp 数组初始化 4.确定遍历顺序 5.debug 入门题 1.斐波那契数 思路 1.f[i]&#xff1a;第 i 个数的值 2.f[i] f[i - 1] f[i - 2] 3.f[0] 0, f[1] 1 4.顺序遍历 5.记得特判 …

Web前端---表格和表单

1.表格概述 表格标记&#xff1a;<table></table> 表格标题标记&#xff1a;<caption></caption> 表头&#xff1a;<th></th>------heading 行标记&#xff1a;<tr></tr>-----r是row 列标记&#xff1a;<td></t…

数据可视化原理-腾讯-散点图

在做数据分析类的产品功能设计时&#xff0c;经常用到可视化方式&#xff0c;挖掘数据价值&#xff0c;表达数据的内在规律与特征展示给客户。 可是作为一个产品经理&#xff0c;&#xff08;1&#xff09;如果不能够掌握各类可视化图形的含义&#xff0c;就不知道哪类数据该用…

快速搭建Vue前端框架

快速搭建Vue前端框架 安装Vue Vue官方安装过程:https://cli.vuejs.org/zh/guide/installation.html 二.创建Vue工程 2.2 安装淘宝镜像 安装淘宝镜像&#xff08;会让你安装Vue的速度加快&#xff09;&#xff1a; npm config set registry https://registry.npm.taobao.or…

CMU 10-414/714: Deep Learning Systems --hw0

hw0 宏观上的步骤: softmax loss: 实现softmax loss代码 概念 softmax就是将结果映射到0~1之间,且所有结果相加为1(概率形式)cross-entropy loss就是计算 p ( x ) log ⁡ q ( x ) p(x)\log {q(x)} p(x)logq(x),此值可用于衡量实际输出与期望输出的距离,进而衡量预测模…