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;以便读者对其有更全面的…

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

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

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

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

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),此值可用于衡量实际输出与期望输出的距离,进而衡量预测模…

Qt 实现橡皮擦拭显示图片

1.简介 在一些游戏中看见类似解密破案的效果&#xff0c;使用手触摸去擦拭图片上的灰尘&#xff0c;然后显示最终的图片&#xff0c;所以也想试试Qt实现的效果。大家有自己想做的效果&#xff0c;都可以尝试。 以下是效果展示图。 可以控制橡皮擦的大小&#xff0c;进行擦拭…

CRMCHAT修复获取客户ip信息,地区信息

CRMCHAT修复获取客户ip信息&#xff0c;地区信息-TP源码网原因&#xff1a; 因pv.sohu.com/cityjson?ieutf-8接口已无法正确获取ip信息&#xff0c;导致后台站点统计无法正确获取用户ip信息&#xff0c;无法获取地区信息 修改 注释掉无用接口地址 修复ip信息 也可以使用&…

NLP评价指标

一、分类任务常见评估&#xff1a; 准确度(Accuracy) 评估预测正确的比例&#xff0c;精确率(Precision) 评估预测正例的查准率&#xff0c;召回率(Recall) 评估真实正例的查全率。如果是多分类&#xff0c;则每个类别各自求P、R最终求平均值。 TP&#xff08;True Positives…

11. Nginx进阶-HTTPS

简介 基本概述 SSL SSL是安全套接层。 主要用于认证用户和服务器&#xff0c;确保数据发送到正确的客户机和服务器上。 SSL可以加密数据&#xff0c;防止数据中途被窃取。 SSL也可以维护数据的完整性&#xff0c;确保数据在传输过程中不被改变。 HTTPS HTTPS就是基于SSL来…

【Unity】Node.js安装与配置环境

引言 我们在使用unity开发的时候&#xff0c;有时候会使用一些辅助工具。 Node.js就是开发中&#xff0c;经常会遇到的一款软件。 1.下载Node.js 下载地址&#xff1a;https://nodejs.org/en 2.安装Node.js ①点击直接点击Next下一步 ②把协议勾上&#xff0c;继续点击…