位运算+leetcode(1)

news2025/1/24 20:47:00

基础

1.基础知识

 以下都是针对数字的二进制进行操作

  • >>  右移操作符
  • <<  左移操作符
  • ~   取反操作符
  •  &  有0就是0,全一才一
  •  |  有一才一 ,全0才0
  • ^  相同为0,相异为1

 异或( ^ )运算的规律

  1. a ^ 0 = a 
  2. a ^ a = 0
  3. a ^ b ^ c =a ^ (b ^ c)
 2.基础操作

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

( n >> x ) & 1

2.给一个数n, 将它的二进制表示中的第x位是修改为1

n = n | (1<<x)

 3.给一个数n, 将它的二进制表示中的第x位是修改为0

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

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

这个意思:将这个数二进制形式,其中从右往左出现的第一个数字1,给保留下来,其它的位的数统统赋值给 0

n & (-n) 得到的就是

-n 表示的就是:从右往左出现的第一个数字1,它的左边区域全部变成相反的

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

n & ( n-1 )

n-1 表示的是:从右往左出现的第一个数字1,它的右边(包括它本身)全部变成相反

 Leetcode刷题

题一:位1的个数

1. 链接

191. 位1的个数 - 力扣(LeetCode)

 2.思路

直接将这个数(二进制表示形式)从右往左每次干掉一个1,然后在更新这个数,同时去统计一下总共进行了几次

3. 代码
int hammingWeight(uint32_t n) {
    int count=0;
    while(n)
    {
        n=n&(n-1);
        count++;
    }
    return count;
}

题二:比特位计数

1. 链接

338. 比特位计数 - 力扣(LeetCode)

2.思路

暴力方法

   遍历 n 个数,每次统计此次所对应的数二进制里有几个1(这个就是题目一),然后再放到数组里去

 动态规划

 arr为我们最终返回的那个数组名

 规律

  • 我们让 arr [0] = 0
  • 当数字为偶数时,此时该数字(n)所含一的个数与 n / 2这个数相等
  • 当数字为奇数时,此时这个数(n)所含一的个数等于 n-1这个所对应的再加上1
 3.代码
//暴力
class Solution {
public:
    vector<int> countBits(int n) {
        vector<int> arr(n+1);
        for(int i=1;i<=n;i++)
        {
           int ret=0;
            while(i>0)
            {
                i=i&(i-1);
                ret++;
            }
            arr[i]=ret;
        }
        return arr;

    }
};
//动态规划
class Solution {
public:
    vector<int> countBits(int n) {
        vector<int> arr(n + 1);
        for (int i = 1; i <= n; i++) {
            if (i % 2 != 0) {
                arr[i] = arr[i - 1] + 1;
            } else {
                arr[i] = arr[i / 2];
            }
        }
        return arr;
    }
};

题三:汉明距离

1. 链接

461. 汉明距离 - 力扣(LeetCode)

2. 思路
  • 首先找到二个数中最大的数,在对最大的数,进行除二,求出其二进制的位数
  • 定义一个变量count,当 ((x >> i) & 1) ! =  ((y >> i) & 1) 成立时,就让count++
  • ((x >> i) & 1) != ((y >> i) & 1) 这个是基础操作里的如何判断一个数第i位是否为 1

 3.代码
class Solution {
public:
    int hammingDistance(int x, int y) {
        int _max = max(x, y);
        int count = 0;
        while (_max) {
            _max = _max / 2;
            count++;
        }
        int lenSum = 0;
        for (int i = 0; i < count; i++) {
            if (((x >> i) & 1) != ((y >> i) & 1)) {
                lenSum++;
            }
        }
        return lenSum;
    }
};

题四:判断字符是否唯一

1.链接

面试题 01.01. 判定字符是否唯一 - 力扣(LeetCode)

2.思路

鸽巢原理:有n个巢,和n+1个鸽子,那么至少会有一个巢鸟的数量>1

astr 是字符串数组名

用数组来模拟哈希表

  • 由于只含有小写字母,那么只要开辟一个数组长度为26的就可以
  • 如果字符串的长度大于26,那么则就返回 false(鸽巢原理
  • 当字符串的长度小于26,这里的映射关系是 astr[i] - 'a'
  • 先让此刻的字符进入哈希表,再去判断该字符在哈希表中位置的值是否大于1
  • 若大于1,则返回 false,否则,就继续循环

 用一个整数来模拟位图

  • 一个整数是4个字节,一个字节是8个比特位,那么就是有36位比特位
  • 由于只含有小写字母,那么一个整数就够用
  • 如果字符串的长度大于26,那么则就返回 false(鸽巢原理
  • 定义一个整数biteMap,并初始化为0(保证此刻biteMap的二进制位都为0,为了方便后面判断 )
  • 再去遍历这个 astr 字符串,先判断该字符在位图所在位置是否为1,
  • 若为1,则返回false
  • 若不为1,则将该字符在位图所在位置修改为1,在继续循环。
  • 若能将这个循环结束,那么则就返回true
 3.代码

法一 哈希表:

//哈希表
class Solution {
public:
    bool isUnique(string astr) {
        int hash[26] = {0};
        for (int i = 0; i < astr.size(); i++) {
            hash[astr[i] - 'a']++;
            if(hash[astr[i] - 'a']>1)
                return false;
        }
 
        return true;
    }
};

法二 位图: 

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

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

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

相关文章

2本对微服务拆分有帮助的书

迁移到云原生应用架构 可在线观看的免费书籍 https://pivotal.io/platform-as-a-service/migrating-to-cloud-native-application-architectures-ebook 微服务架构设计模式 世界十大架构师之一&#xff1a;克里斯理查森著

【51单片机】LED点阵屏(江科大)

9.1LED点阵屏 1.LED点阵屏介绍 LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。 2.LED点阵屏工作原理 LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已。原理图如下 每一行的阳极连在一起,每一列…

如何在C# Windows Forms应用程序中实现控件之间的连接线

帮我实现绘图工具多个控件连接线&#xff0c;请用c#代码实现 实现绘图工具中多个控件之间的连接线功能&#xff0c;可以通过以下几个步骤来进行&#xff1a; 定义连接线的数据模型&#xff1a;首先需要定义一个模型来表示连接线&#xff0c;这个模型应该包含起点和终点的坐标。…

【Effective Objective - C 2.0】——读书笔记(四)

文章目录 二十三、通过委托与数据源协议进行对象间通信二十四、将类的实现代码分散到便于管理的数个分类之中二十五、总是为第三方的分类名称加前缀二十六、切勿在分类里面声明属性二十七、使用“class-continuation分类”隐藏实现细节二十八、通过协议提供匿名对象 二十三、通…

【Chrono Engine学习总结】4-vehicle-4.1-vehicle的基本概念

由于Chrono的官方教程在一些细节方面解释的并不清楚&#xff0c;自己做了一些尝试&#xff0c;做学习总结。 1、基本介绍 Vehicle Overview Vehicle Mannel Vehicle的官方demo 1.1 Vehicle的构型 一个车辆由许多子系统构成&#xff1a;悬挂、转向、轮子/履带、刹车/油门、动…

书生谱语-大语言模型测试demo

课程内容简介 通用环境配置 开发机 InterStudio pip 换源 临时使用镜像源安装&#xff0c;如下所示&#xff1a;some-package 为你需要安装的包名 pip install -i https://mirrors.cernet.edu.cn/pypi/web/simple some-package设置pip默认镜像源&#xff0c;升级 pip 到最新…

力扣1122. 数组的相对排序(哈希表)

Problem: 1122. 数组的相对排序 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.利用arr2创建一个无序映射&#xff08;map集合&#xff09;&#xff0c;以其中的元素作为键&#xff0c;值默认设置为0&#xff1b; 2.扫描arr1数组统计arr2元素在其中的个数(将个…

Pandas教程12:常用的pd.set_option方法,显示所有行和列+不换行显示等等...

---------------pandas数据分析集合--------------- Python教程71&#xff1a;学习Pandas中一维数组Series Python教程74&#xff1a;Pandas中DataFrame数据创建方法及缺失值与重复值处理 Pandas数据化分析&#xff0c;DataFrame行列索引数据的选取&#xff0c;增加&#xff0c…

matlab发送串口数据,并进行串口数据头的添加,我们来看下pwm解析后并通过串口输出的效果

uintt16位的话会在上面前面加上00&#xff0c;16位的话一定是两个字节&#xff0c;一共16位的数据 如果是unint8的话就不会&#xff0c; 注意这里给的是13&#xff0c;但是现实的00 0D&#xff0c;这是大小端的问题&#xff0c;在matlanb里设置&#xff0c;我们就默认用这个模式…

python 笔记:shapely(形状篇)

主要是点&#xff08;point&#xff09;、线&#xff08;linestring&#xff09;、面&#xff08;surface&#xff09; 1 基本方法和属性 object.area 返回对象的面积&#xff08;浮点数&#xff09; object.bounds 返回一个&#xff08;minx, miny, maxx, maxy&#xff09;元…

基于Python的HTTP隧道安全性分析:魔法背后的锁与钥匙

当我们谈论基于Python的HTTP隧道时&#xff0c;不禁让人想起那些神秘的魔法门。但是&#xff0c;在魔法背后&#xff0c;我们也需要确保安全性&#xff0c;就像需要确保魔法不会落入邪恶之手一样。那么&#xff0c;基于Python的HTTP隧道在安全性方面表现如何呢&#xff1f;让我…

【Java程序设计】【C00270】基于Springboot的moba类游戏攻略分享平台(有论文)

基于Springboot的moba类游戏攻略分享平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的游戏攻略分享平台 本系统分为系统功能模块、管理员功能模块、以及用户后台功能模块。 系统功能模块&#xff1a;在平台首…

[VulnHub靶机渗透] Nyx

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

【Java程序设计】【C00253】基于Springboot的在线考试管理系统(有论文)

基于Springboot的在线考试管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的在线考试系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xff1a;系统登录&#xff0c;管理…

综合项目---博客

一.运行环境 192.168.32.132 Server-Web linux Web 192.168.32.133 Server-NFS-DNS linux NFS/DNS 基础配置 1.配置主机名静态ip 2.开启防火墙并配置 3.部分开启selinux并配置 4.服务器之间通过阿里云进行时间同步 5.服务器之间实现ssh免密…

牛客——递归实现组合型枚举(枚举,dfs)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 从 1~n 这 n 个整数中随机选出 m 个&#xff0c;输出所有可能的选择方案。n>0n \gt 0n>0, 0≤m≤n0 \leq m \leq n0≤m≤n, n(n−m)≤25n(n-m)\leq 25n(n−m)≤25。 输入描述…

大白话 ChatGPT 技术原理

▼最近直播超级多&#xff0c;预约保你有收获 近期直播&#xff1a;《Agent 企业级应用案例实战》 —1— ChatGPT 大模型如何完成训练的&#xff1f; ChatGPT 大模型训练分为以下3个步骤&#xff1a; 第一步、Pretraining 预训练。 给大模型海量的文本进行训练&#xff0c;99%…

申请SSL证书怎么进行域名验证?域名验证的三种方式

SSL证书是用于加密和保护Web服务器和浏览器之间通信的数字证书&#xff0c;在申请SSL证书时&#xff0c;为了防止域名被冒用&#xff0c;对于申请SSL证书的域名&#xff0c;要求先验证这个域名的所有权。而目前可用的域名验证SSL证书方式有三种&#xff1a;分别是DNS验证、邮箱…

【Java程序设计】【C00264】基于Springboot的原创歌曲分享平台(有论文)

基于Springboot的原创歌曲分享平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的原创歌曲分享平台 本系统分为平台功能模块、管理员功能模块以及用户功能模块。 平台功能模块&#xff1a;在平台首页可以查看首…