LeetCode2595

LeetCode2595

目录


题目描述

给你一个整数 n,请你返回一个长度为 2 的数组 ans,其中:

  • ans[0]n 的二进制表示中偶数下标(从 0 开始)的 1 的个数。
  • ans[1]n 的二进制表示中奇数下标的 1 的个数。

示例

示例 1

输入:

java 复制代码
n = 17

输出:

java 复制代码
[2, 0]

解释:

  • 17 的二进制表示为 10001
  • 偶数下标(0, 2, 4)中有 2 个 1。
  • 奇数下标(1, 3)中有 0 个 1。

示例 2

输入:

java 复制代码
n = 2

输出:

java 复制代码
[0, 1]

解释:

  • 2 的二进制表示为 10
  • 偶数下标(0)中有 0 个 1。
  • 奇数下标(1)中有 1 个 1。

思路分析

问题核心

我们需要统计整数 n 的二进制表示中,偶数下标和奇数下标的 1 的个数。

思路拆解

  1. 二进制遍历
    • 从最低位开始遍历 n 的二进制表示。
  2. 奇偶下标统计
    • 使用一个变量 i 表示当前下标,初始值为 0(偶数)。
    • 每次遍历后,i 在 0 和 1 之间切换,表示偶数下标和奇数下标。
  3. 统计 1 的个数
    • 如果当前二进制位是 1,则根据 i 的值更新 ans[0]ans[1]
  4. 右移操作
    • 每次遍历后,将 n 右移 1 位,继续处理下一个二进制位。

代码段

java 复制代码
class Solution {
    public int[] evenOddBit(int n) {
        int[] ans = new int[2]; 
        for (int i = 0; n > 0; n >>= 1, i ^= 1) { 
            ans[i] += n & 1; 
        }
        return ans;
    }
}

代码逐行讲解

1. 初始化结果数组

java 复制代码
int[] ans = new int[2];
  • ans 是一个长度为 2 的数组,ans[0] 用于存储偶数下标的 1 的个数,ans[1] 用于存储奇数下标的 1 的个数。

2. 遍历二进制位

java 复制代码
for (int i = 0; n > 0; n >>= 1, i ^= 1) {
  • 从最低位开始遍历 n 的二进制表示。
  • n >>= 1:每次遍历后将 n 右移 1 位。
  • i ^= 1:每次遍历后切换 i 的值(0 和 1 之间切换),表示偶数下标和奇数下标。

3. 统计 1 的个数

java 复制代码
ans[i] += n & 1;
  • n & 1:获取当前二进制位的最低位。
  • 如果当前二进制位是 1,则根据 i 的值更新 ans[0]ans[1]

4. 返回结果

java 复制代码
return ans;
  • 返回结果数组 ans

复杂度分析

时间复杂度

  • 遍历 n 的二进制表示,时间复杂度为 O(log n)

空间复杂度

  • 只使用了常数级别的额外空间,因此空间复杂度为 O(1)

总结的知识点

1. 二进制操作

  • 使用右移操作 n >>= 1 遍历二进制位。
  • 使用按位与操作 n & 1 获取最低位。

2. 奇偶下标切换

  • 使用 i ^= 1 在 0 和 1 之间切换,表示偶数下标和奇数下标。

3. 数组操作

  • 使用数组 ans 统计偶数下标和奇数下标的 1 的个数。

整合

java 复制代码
class Solution {
    public int[] evenOddBit(int n) {
        int[] ans = new int[2]; // 初始化结果数组
        for (int i = 0; n > 0; n >>= 1, i ^= 1) { // 遍历二进制位
            ans[i] += n & 1; // 统计 1 的个数
        }
        return ans; // 返回结果
    }
}

总结

通过遍历 n 的二进制表示,并利用奇偶下标切换统计 1 的个数。

相关推荐
a努力。7 分钟前
国家电网Java面试被问:最小生成树的Kruskal和Prim算法
java·后端·算法·postgresql·面试·linq
洛生&13 分钟前
Counting Towers
算法
Evand J22 分钟前
【MATLAB例程,附代码下载链接】基于累积概率的三维轨迹,概率计算与定位,由轨迹匹配和滤波带来高精度位置,带测试结果演示
开发语言·算法·matlab·csdn·轨迹匹配·候选轨迹·完整代码
X在敲AI代码25 分钟前
LeetCode 基础刷题D2
算法·leetcode·职场和发展
源代码•宸30 分钟前
Leetcode—1929. 数组串联&&Q1. 数组串联【简单】
经验分享·后端·算法·leetcode·go
数据大魔方40 分钟前
【期货量化实战】跨期套利策略:价差交易完整指南(TqSdk源码详解)
数据库·python·算法·github·程序员创富
weixin_4617694042 分钟前
15. 三数之和
c++·算法·leetcode·三数之和
NAGNIP43 分钟前
一文搞懂机器学习中的学习理论!
算法·面试
Evand J1 小时前
【MATLAB代码介绍】基于累积概率的三维轨迹匹配与定位,由轨迹匹配和卡尔曼滤波形成算法,带测试结果演示
算法·matlab·滤波·定位·导航·轨迹匹配
l1t1 小时前
NineData第三届数据库编程大赛:用一条 SQL 解数独问题我的参赛程序
数据库·人工智能·sql·算法·postgresql·oracle·数独