LeetCode刷题日记 2020/8/23
题目描述
给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。
示例 1:
输入: [5,7]
输出: 4
示例 2:
输入: [0,1]
输出: 0
题目来源:https://leetcode-cn.com/problems/bitwise-and-of-numbers-range/
自己做的时候暴力破解的 逛评论区发现一个很巧妙的解法: 通过按位与运算来解 代码如下:
我们只需要一个经常用的一个思想,去考虑子问题。我们现在要做的是把从 m 到 n 的所有数字的 32 个比特位依次相与。直接肯定不能出结果,如果要是只考虑 31 个比特位呢,还是不能出结果。然后依次降低规模,30、29 ... 3,2 直到 1。如果让你说出从 m 到 n 的数字全部相与,最低位的结果是多少呢?
最低位会有很多数相与,要么是 0 ,要么是 1,而出现了 0 的话相与的结果一定会是 0。
只看所有数的最低位变化情况,m 到 n 的话,要么从 0 开始递增,01010101...,要么从 1 开始递增 10101010...。
因此,参与相与的数中最低位要么在第一个数字第一次出现 0 ,要么在第二个数字出现第一次出现 0 。
如果 m < n,也就是参与相与的数字的个数至少有两个,所以一定会有 0 的出现,所以相与结果一定是 0。
看具体的例子,[5,7]。
最低位序列从 1 开始递增, 也就是最右边的一列 101
m 5 1 0 1
6 1 1 0
n 7 1 1 1
0
此时 m < n,所以至少会有两个数字,所以最低位相与结果一定是 0。
解决了最低位的问题,我们只需要把 m 和 n 同时右移一位。然后继续按照上边的思路考虑新的最低位的结果即可。
而当 m == n 的时候,很明显,结果就是 m 了。
代码中,我们需要用一个变量 zero 记录我们右移的次数,也就是最低位 0 的个数。
public int rangeBitwiseAnd(int m, int n) {
int zeros = 0;
while (n > m) {
zeros++;
m >>>= 1;
n >>>= 1;
}
//将 0 的个数空出来
return m << zeros;
}
作者:windliang
链接:https://leetcode-cn.com/problems/bitwise-and-of-numbers-range/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by--41/
LeetCode刷题日记 2020/8/23的更多相关文章
- Leetcode | 刷题日记(1)
本文记录个人刷题记录 推荐两个刷题网站: 地址:https://leetcode.com/ 另外一个地址:http://www.lintcode.com/ 1.Write a SQL query to ...
- LeetCode刷题的一点个人建议和心得
目录 1. 为什么我们要刷LeetCode? 2. LeetCode的现状和问题 3. 本文的初衷 4. LeetCode刷题建议 4.1入门数据结构,打基础阶段 4.2 建立 ...
- LeetCode刷题总结-链表
LeetCode刷题总结-链表 一.链表 链表分为单向链表.单向循环链表和双向链表,一下以单向链表为例实现单向链表的节点实现和单链表的基本操作. 单向链表 单向链表也叫单链表,是链表中最简单的 ...
- C#LeetCode刷题-栈
栈篇 # 题名 刷题 通过率 难度 20 有效的括号 C#LeetCode刷题之#20-有效的括号(Valid Parentheses) 33.0% 简单 42 接雨水 35.6% 困难 71 简 ...
- C#LeetCode刷题-动态规划
动态规划篇 # 题名 刷题 通过率 难度 5 最长回文子串 22.4% 中等 10 正则表达式匹配 18.8% 困难 32 最长有效括号 23.3% 困难 44 通配符匹配 17.7% ...
- C#LeetCode刷题-分治算法
分治算法篇 # 题名 刷题 通过率 难度 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组的中位数(Median of Two Sorted Arrays)-该题未达最优解 30 ...
- C#LeetCode刷题-二分查找
二分查找篇 # 题名 刷题 通过率 难度 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组的中位数(Median of Two Sorted Arrays)-该题未达最优解 30 ...
- C#LeetCode刷题-字符串
字符串篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串 24.6% 中等 5 最长回文子串 22.4% 中等 6 Z字形变换 35.8% 中等 8 字符串转整数 (atoi) ...
- C#LeetCode刷题-数组
数组篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 43.1% 简单 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组 ...
- C#LeetCode刷题-链表
链表篇 # 题名 刷题 通过率 难度 2 两数相加 29.0% 中等 19 删除链表的倒数第N个节点 29.4% 中等 21 合并两个有序链表 C#LeetCode刷题之#21-合并两个有序链 ...
随机推荐
- 【ToolChains】| CMake 技巧
判断 CMake 编译环境 编译类型 CMAKE_BUILD_TYPE 可取值为:Debug, Release, RelWithDebInfo, MinSizeRel 等预设值 if (CMAKE_B ...
- Kafka的Rebalance机制可能造成的影响及解决方案
一.kafka的rebalance机制在Kafka中,当有新消费者加入或者订阅的Topic数发生变化时,会触发Rebalance(再均衡:在同一个消费者组当中,分区的所有权从一个消费者转移到另外一个消 ...
- 深度学习(三)——Transforms的使用
一.Transforms的结构及用法 导入transforms from torchvision import transforms 作用:图片输入transforms后,可以得到一些预期的变换 1. ...
- 淘宝flexible.js源码分析
下面三种情况都会刷新页面,都会触发load事件. 1.a标签的超链接. 2.F5或者刷新按钮(强制刷新) 3.前进后退按钮 但是火狐中,有个特点,有个"往返缓存",这个缓存中不仅保 ...
- 开发中history和location
- vscode prettier保存代码时自动格式化
https://blog.csdn.net/qq_37815596/article/details/109225879
- Winform的使用
Winform是什么 以下内容,来自朝夕教育课程,没有基础的可以去朝夕学学.这里主要是为了方便我自己回顾查询 创建Winform程序 Program类 Winform项目结构介绍 Winform控件简 ...
- excel如何自动获取本周工作日的日期显示作为标题(周一至周五)
一.背景: 每周发周报的标题格式为:本周一到本周五的日期内容,如下:但是每隔一周发送的时候需要改一下周报标题里面的日期,比较麻烦目前的需求是通过函数自动化生成,根据当前的日期去定位出本周一的日期以及本 ...
- nginx 负载均衡 proxy_pass 与 upstream 及 rewrite ,expires 的配置总结
本文为博主原创,转载请注明出处: 先查看 一段 nginx 相关的配置: location /test/ { set $arg_remote_addr $request_id; proxy_p ...
- Linux-网络-子网-子网掩码-网关-DNS解析