当前位置: 首页 > news >正文

1532.在区间范围内统计奇数数目

给你两个非负整数 low 和 high 。请你返回 low  high 之间(包括二者)奇数的数目。

示例 1:

输入:low = 3, high = 7
输出:3
解释:3 到 7 之间奇数数字为 [3,5,7] 。

示例 2:

输入:low = 8, high = 10
输出:1
解释:8 到 10 之间奇数数字为 [9] 。

思路:

用[1,high]区间奇数个数[1,low-1]区间奇数个数。

[1,n]区间奇数个数=(n+1)/2.如1~2为1;1~7为4,所以3~7为3.

class Solution {public int countOdds(int low, int high) {return((high+1)>>1)-(low>>1);}
}

最终公式:

((high + 1) >> 1) - (low >> 1)

这个式子意思是:
从 1 到 high 有多少个奇数 ➖ 从 1 到 (low - 1) 有多少个奇数。


🧩 位运算 >> 1 是什么?

👉 x >> 1 等于 x ÷ 2(向下取整)

这是右移一位,等价于整数除以 2:

  • 7 >> 1 = 3(7 ÷ 2 = 3.5 向下取整为 3)

  • 8 >> 1 = 4

⚠️ 注意:这是 整数除法,不会有小数。


🧮 举例解释公式:

我们来看例子:
比如 low = 3, high = 7,区间是 [3, 4, 5, 6, 7]

里面有奇数:3, 5, 7 → 总共 3 个奇数

来看公式计算:

((high + 1) >> 1) - (low >> 1) = ((7 + 1) >> 1) - (3 >> 1) = (8 >> 1) - (1) = 4 - 1 = 3 ✅

再看一个例子:

low = 4, high = 10,区间 [4,5,6,7,8,9,10]

奇数有:5, 7, 9 → 3 个奇数

用公式:

((10 + 1) >> 1) - (4 >> 1) = (11 >> 1) - (2) = 5 - 2 = 3 ✅


✅ 为什么不直接 (high - low + 1) / 2 + ...

这种写法是更快且更简洁的数学解法:

  • 它利用了从 1 到 x 之间奇数个数就是 (x + 1) / 2

  • (x + 1) >> 1 是等效于 (x + 1) / 2 的写法,但在位运算层面更快

🌟 Java 中常见的位运算符

运算符名称作用
&按位与同为1结果才是1
``按位或
^按位异或相同为0,不同为1
~按位取反0变1,1变0
<<左移向左移动位数,相当于乘2
>>右移向右移动位数,相当于除2(符号位保留)
>>>无符号右移不保留符号位(正负都补0)


💡 常见用途举例:


1️⃣ 判断奇偶数(%2 的替代)

if ((n & 1) == 1) {

    System.out.println("n 是奇数");

}

 else {

    System.out.println("n 是偶数");

}

  • 原理:奇数的二进制最后一位一定是 1


2️⃣ 交换两个数(不使用临时变量)

a = a ^ b; b = a ^ b; a = a ^ b;


3️⃣ 检查某一位是否为1(掩码)

int n = 10; // 二进制:1010 int k = 1; // 想检查第2位(从右边开始数,从0开始) boolean isBitSet = (n & (1 << k)) != 0;

  • (1 << k) 相当于“掩码”——只关心第 k 位是否为1


4️⃣ 设置 / 清除 / 取反 某一位

  • 设置第 k 位为 1

    n = n | (1 << k);

  • 清除第 k 位为 0

    n = n & ~(1 << k);

  • 翻转第 k 位:

    n = n ^ (1 << k);


5️⃣ 快速乘除 2 的幂

n << 1 // 相当于 n * 2 n >> 1 // 相当于 n / 2(向下取整) n << k // 相当于 n * 2^k


6️⃣ 判断两个整数是否符号相同

boolean sameSign = (a ^ b) >= 0;

  • 如果符号相同,a^b 的符号位是 0


7️⃣ 只出现一次的数字(LeetCode 常考)

给定一个数组,其他数字都出现两次,只有一个数字出现一次,找出它。

public int singleNumber(int[] nums) { int result = 0; for (int num : nums) { result ^= num; } return result; }

  • 利用异或:a ^ a = 00 ^ b = b


8️⃣ 判断一个数是不是 2 的幂(只能有一个1)

boolean isPowerOfTwo = (n > 0) && ((n & (n - 1)) == 0);


🔚 总结一句口诀:

“与可清零,或可置一,异或翻转最神奇;移位快算乘除法,掩码专攻某一位。”

 

http://www.xdnf.cn/news/1061551.html

相关文章:

  • Android 当apk是系统应用时,无法使用webView的解决方案
  • 京运通601908,一只值得长期跟踪操作的波段投资标的,两个指标即可做好
  • Cargo 与 Rust 项目
  • Spring Boot自动配置原理
  • 【智能安全帽新升级】搭载VTX316TTS语音合成芯片,让安全“听得见”!
  • 【国产AI服务器】全国产PCIE5.0交换板,替代博通89104/89144,支持海光、龙芯等平台
  • HTTP 请求方法与状态码
  • “地标界爱马仕”再拓疆域:世酒中菜联袂赤水金钗石斛定义中国GI
  • 力扣-169.多数元素
  • Kafka线上集群部署方案:从环境选型到资源规划思考
  • http2与websocket关系
  • Linux——linux的基本命令
  • lingma(阿里云Ai)结合idea使用
  • day43-硬件学习之ARM基础知识
  • 从生活场景学透 JavaScript 原型与原型链
  • 棱镜观察|EMB“重构”卡钳,车企降本压力与Brembo困局
  • 力扣-62.不同路径
  • Cesium、ThreeWebGL详解(二)渲染引擎向GPU传数据、性能优化、引擎对比
  • Docker容器常用命令汇总
  • 华为云Flexus+DeepSeek征文 | 利用Dify平台构建多智能体协作系统:从单体到集群的完整方案
  • python自助棋牌室管理系统
  • 全面掌握 C++ 基础:关键特性与进化
  • Llama 4 模型卡及提示格式介绍
  • svn客户端使用教程简易入门:附外网远程访问内网SVN服务通用方法
  • 【服务器R环境架构】基于 micromamba下载 R 库包
  • React封装框架dvajs(状态管理+异步操作+数据订阅等)
  • Windsurf SWE-1模型评析:软件工程的AI革命
  • TensorFlow+CNN垃圾分类深度学习全流程实战教程
  • Python设计模式终极指南:18种模式详解+正反案例对比+框架源码剖析
  • STM32 HAL 初始化I2C启动DS1307