刷题 位运算 / 数学

news2024/10/8 8:57:06

面试经典 150 题 - 位运算

⭐️⭐️67. 二进制求和

在这里插入图片描述

加法进位

class Solution {
public:
    string addBinary(string a, string b) {
        int na = a.size(), nb = b.size();
        string ans;
        ans.reserve(max(na, nb) + 1); // 预留空间,避免动态扩展时的性能损耗
        int carry = 0;
        for (int i = na - 1, j = nb - 1; i >= 0 || j >= 0 || carry > 0; --i, --j) {
            int x = (i >= 0) ? a[i] - '0' : 0;  // 从 a 中取值
            int y = (j >= 0) ? b[j] - '0' : 0;  // 从 b 中取值
            int sum = x + y + carry;
            carry = sum / 2;  // 更新进位
            ans.push_back('0' + (sum % 2));  // 将当前位加入结果
        }
        reverse(ans.begin(), ans.end());  // 反转结果,保证顺序正确
        return ans;
    }
};

⭐️⭐️⭐️190. 颠倒二进制位

在这里插入图片描述

class Solution {
public:
    // 思考:如何取 n 的最后一位? (n & 1)
    // 思考:如何取 n 的倒数第二位?(n >> 1) & 1
    // 如何 取出 倒数第二位 并赋值给 另一个数字的第二位?
    // ans = ans | (((n >> 1) & 1) << 31)
    uint32_t reverseBits(uint32_t n) {
        uint32_t ans = 0;
        for (int i = 0; i < 32; ++i) {
            ans = ans | ((n & 1) << (31 - i));
            n >>= 1; 
        }
        return ans;
    }
};

⭐️191. 位1的个数

class Solution {
public:
    int hammingWeight(int n) {
        int ans = 0;
        for (int i = 0; i < 32 && n > 0; ++i) { // n = 0 可以提前截止
            ans += (n & 1);     // 取最后一位
            n >>= 1;            // 将n右移一位
        }
        return ans;
    }
};

⭐️136. 只出现一次的数字 - 异或运算

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

⭐️⭐️⭐️⭐️137. 只出现一次的数字 II - 一个数字出现一次 - 其他出现三次

在这里插入图片描述

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ans = 0;
        for (int i = 0; i < 32; ++i) {
            int sum = 0;
            for (auto& num : nums) {
                sum += ((num >> i) & 1); // 求第i位上的和
            }
            ans |= (sum % 3) << i;
        }
        return ans;
    }
};

⭐️⭐️⭐️⭐️201. 数字范围按位与 - 最长公共前缀

数学 + 位运算:找到左右边界公共前缀位
在这里插入图片描述

    int rangeBitwiseAnd(int left, int right) {
        int ans = 0;
        for (int i = 0; i < 32; ++i) {
            int a = (left >> (31 - i)) & 1;
            int b = (right >> (31 - i)) & 1;
            if (a != b) {
                break;
            } else {
                ans |= (a << (31 - i));
            }
        }
        return ans;
    }

代码优化

    // 直接一直右移直到相等
    int rangeBitwiseAnd(int left, int right) {  
        int shift = 0;
        while (left != right) {
            left >>= 1;
            right >>= 1;
            ++shift;
        }
        return left << shift;
    }

面试经典 150 题 - 数学

66. 加一

在这里插入图片描述

不优雅写法

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        int carry = 0;
        for (int i = digits.size() - 1; i >= 0; --i) {
            int sum = carry + digits[i] + (i == digits.size() - 1);
            digits[i] = sum % 10;
            carry = sum / 10;
            if (carry == 0) break;
        }
        if (carry > 0) {
            vector<int> result(digits.size() + 1);
            result[0] = carry;
            for (int i = 1; i <= digits.size(); ++i) {
                result[i] = digits[i - 1];
            }
            return result;
        } else {
            return digits;
        }
    }
};

优雅写法

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        int carry = 1;  // 初始进位为1,因为要加1
        for (int i = digits.size() - 1; i >= 0; --i) {
            int currentSum = digits[i] + carry;
            digits[i] = currentSum % 10;  // 更新当前位
            carry = currentSum / 10;      // 计算进位
            if (carry == 0) return digits; // 如果没有进位,直接返回
        }
        // 如果有剩余进位
        digits.insert(digits.begin(), carry);
        return digits;
    }
};

⭐️172. 阶乘后的零

class Solution {
public:
    // 2 * 5 会产生尾随0 --> 取决于 5 的数量
    // 5 10 15 20 25(两个5) 30 35 40 45 50 55 60 65 70 75(两个5) 85 95 ...
    // 有几个 5 的倍数      --> +1
    // 有几个 5^2 的倍数    --> +2 (但由于在5的倍数中被加过一次) --> +1
    // 有几个 5^3 的倍数    --> +3 (但由于在5的倍数和 5^2 的倍数中被加过一次) --> +1
    // ...
    int trailingZeroes(int n) {
        int sum = 0;
        while (n >= 1) {
            n = n / 5;
            sum += n;
        }
        return sum;
    }
};

⭐️⭐️69. x 的平方根 - 二分查找 - 最大小于等于

在这里插入图片描述

class Solution {
public:
    // 本题二分查找第一个小于等于 target 的值
    int mySqrt(int x) {
        if (x == 0 || x == 1) return x;
        int left = 1, right = x / 2;  // 上界直接设置为 x / 2 即可
        while (left <= right) {
            // 循环不变量
            // (left - 1) < x / (left - 1)
            // (right + 1) > x / (right + 1)
            int mid = left + (right - left) / 2;
            if (mid == x / mid) {
                return mid;
            } else if (mid < x / mid) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        // 最终是 left = mid = right, 注意有 (right + 1) > x / (right + 1)
        // 如果 mid < x / mid --> left = mid + 1 = right + 1, 可以返回 right
        // 如果 mid > x / mid --> right = mid - 1 = left - 1, 可以返回 right
        return right;
    }
};

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

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

相关文章

platform bus平台总线详解

往期内容 驱动中的device和device_driver结构体-CSDN博客bus总线的相关结构体和注册逻辑-CSDN博客bus中设备驱动的probe触发逻辑和device、driver的添加逻辑-CSDN博客 前言 注&#xff1a;以下的代码皆摘自于linux 4.9.88版本的内核源码&#xff0c;不同版本可能有所出入。 之…

【EXCEL数据处理】保姆级教程 000016案例 EXCEL的vlookup函数。

【EXCEL数据处理】000016案例 vlookup函数。 前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】保姆级教…

【动态规划】斐波那契模型 dp

动态规划的步骤&#xff1a; 状态表示。所谓状态表示就是 dp 表里的值表示什么含义&#xff0c;那么状态表示怎么找呢&#xff1f; a. 题目要求 b. 经验&#xff08;以某一个位置为结尾 / 起点&#xff09; 题目要求 c. 分析问题的过程中发现重复子问题状态转移方程。dp[ i ] …

ChatGPT Canvas:系统提示词泄漏了~

OpenAI 推出了一款叫做 Canvas 的新工具&#xff0c;用来帮助用户更好地与 ChatGPT 协作写作和编程。详细介绍可以看这篇文章&#xff1a;ChatGPT Canvas&#xff1a;交互式对话编辑器-CSDN博客​编辑 以下是 OpenAI 新功能 “Canvas” 的系统提示内容 你是 ChatGPT&#xff0…

基于连续小波变换(CWT)批量生成一维信号的时频图 最终生成30张时频图。生成的图像可用于后续的深度学习分类或其他处理。附详细的说明文档。

Matlab基于连续小波变换&#xff08;CWT&#xff09;&#xff0c;将一维信号批量生成时频图的源代码。此示例中&#xff0c;原始信号data是30*1280的格式&#xff0c;一共30条信号&#xff0c;信号长度为1280。最终生成30张时频图。生成的图像可用于后续的深度学习分类或其他处…

SpringBoot开发——SpringSecurity安全框架17个业务场景案例(二)

文章目录 一、Spring Security 常用应用场景介绍二、Spring Security场景案例6、CSRF 保护(CSRF Protection)6.1 Spring Security 配置6.2 业务逻辑代码7、密码编码(Password Encoding)7.1 Spring Security 配置7.2 业务逻辑代码7.3 控制器8、方法级安全性(Method Securit…

Vue2电商项目(八) 完结撒花:图片懒加载、路由懒加载、打包的map文件

一、图片懒加载 安装&#xff1a;npm i vue-lazyload1.3 -s &#xff08;弹幕建议按1.3版本&#xff09; 引入 // 引入懒加载的图片 import hlw from /assets/hulu.jpg // 引入插件 import VueLazyload from vue-lazyload // 引入插件 Vue.use(VueLazyload, {// 懒加载默认的图…

Oracle登录报错-ORA-01017: invalid username/password;logon denied

接上文&#xff1a;Oracle创建用户报错-ORA-65096: invalid common user or role name 我以为 按照上文在PDB里创建了用户&#xff0c;我以为就可以用PLSQL远程连接了&#xff0c;远程服务器上也安装了对应版本的Oracle客户端&#xff0c;但是我想多了&#xff0c;客户只是新建…

【爬虫】网站反debugger、内存爆破以及网站限制开发者工具

【爬虫】网站反debugger、内存爆破以及网站直接限制开发者工具 声明&#xff1a;本文中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0…

JWT集成Keycloak

一、直接使用现有域账号、密码获取token方式 1.KeyClack 使用现有配置 Client id : account-console 2.服务配置文件配置 3.API接口配置 4. 获取token 5.调用方式&#xff08;Swagger&#xff09;(代码方式直接在请求头加上token) 5.1 配置在Swagger访问 5.2 访问需要认证的接…

JavaWeb——Vue路由(概述、介绍、使用、解决bug)

目录 概述 介绍 使用 解决bug 概述 员工管理的页面已经制作完成。其他页面的制作方式一致。 项目中准备了部门管理的页面组件 DeptView &#xff0c;这样就有了员工管理和部门管理两个页面组件。 在系统中&#xff0c;要实现点击部门管理菜单展示部门管理组件&#xff0c…

为什么Java不支持多重继承?

不支持多重继承主要是因为会产生“菱形继承”&#xff0c;也称为钻石继承的问题。 那什么是菱形继承呢&#xff1f; 它涉及到一个类继承两个父类&#xff0c;而这两个父类又继承自同一个祖先类。这种结构在没有适当处理的情况下&#xff0c;会导致继承层次中的歧义和冗余。 如…

关于BSV区块链覆盖网络的常见问题解答(下篇)

​​发表时间&#xff1a;2024年9月20日 在BSV区块链上的覆盖网络服务为寻求可扩展、安全、高效交易处理解决方案的开发者和企业家开辟了新的视野。 作为开创性的曼达拉升级的一部分&#xff0c;覆盖网络服务提供了一个强大的框架&#xff0c;用于管理特定类型的交易和数据访问…

【目标检测】室内地板砖铺设缺陷检测数据集2000张VOC+YOLO格式

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2002 标注数量(xml文件个数)&#xff1a;2002 标注数量(txt文件个数)&#xff1a;2002 标注…

图论大总结

图论基础 98. 所有可达路径 result [] path [] def dfs(graph,x,n):if x n:result.append(path[:])returnfor i in range(1,n1):if graph[x][i] 1:path.append(i)dfs(graph,i,n)path.pop() def main():n,m map(int,input().split())# 邻接矩阵graph [[0]*(n1) for _ in …

【EXCEL数据处理】000021 案例 保姆级教程,附多个操作案例。EXCEL文档安全性设置。

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】000021 案例 保姆级教程&#xff0c;附多个操作案例。…

C#高级编程笔记--字符串和正则表达式

本章的主要内容如下&#xff1a; 创建字符串 格式化表达式 正则表达式​​​​​​​ 1.1 System.String类 System.String是一个类&#xff0c;专门用于存储字符串&#xff0c;允许对字符串进行许多操作。由于这种数据类型非常重要&#xff0c;C#提供了它自己…

【C++堆(优先队列)】2233. K 次增加后的最大乘积|1685

本文涉及知识点 C堆(优先队列) 贪心&#xff08;决策包容性) LeetCode 2233. K 次增加后的最大乘积 给你一个非负整数数组 nums 和一个整数 k 。每次操作&#xff0c;你可以选择 nums 中 任一 元素并将它 增加 1 。 请你返回 至多 k 次操作后&#xff0c;能得到的 nums的 最…

用Python实现运筹学——Day 15: 线性规划的项目实战

一、学习内容 在本节中&#xff0c;我们将综合应用之前学习的线性规划知识&#xff0c;解决一个复杂的实际问题。通过这个实战项目&#xff0c;进一步理解线性规划在资源分配问题中的应用。 二、实战案例&#xff1a;公司资源分配问题 2.1 问题描述&#xff1a; 某公司生产两…

Conda答疑

文章目录 优雅的使用Conda管理python环境1. conda info -e 和conda env list区别2.conda创建环境 创建的新环境在哪个文件夹下3. 自定义路径4. anaconda 新建环境 包是来自哪里4.1. 默认 Anaconda 仓库4.2. Conda-Forge4.3. 镜像源4.4. 自定义频道4.5. 总结 5. conda config --…