2026-01-20-LeetCode刷题笔记-3314-构造最小位运算数组I


title: 2026-01-20-LeetCode刷题笔记-3314-构造最小位运算数组I

date: 2026-01-20

tags:

  • 算法学习
  • LeetCode
  • 位运算

题目信息


题目描述

给定一个整数数组 nums(题面为素数数组),对每个 nums[i] 寻找最小的非负整数 x,使得 x | (x + 1) == nums[i]。若不存在这样的 x,返回 -1。


初步思路

  1. 观察 x | (x + 1):它会把 x 的"最右侧第一个 0"变成 1,因此结果必然以连续的 1 结尾。
  2. 若 y = nums[i],设 y 末尾连续 1 的个数为 k,则最小的 x 就是把这段连续 1 中最高位的那个 1 清掉。
  3. 题面为素数数组,因此只有 y=2 为偶数且无解,其他 y 都是奇数可处理。

算法分析

  • 核心:统计 y 的末尾连续 1 的个数 k,然后 x = y - (1 << (k - 1))
  • 技巧:x | (x + 1) 的结果一定是奇数且以连续 1 结尾
  • 时间复杂度:O(n * k),k 为末尾连续 1 的数量(总体很小)
  • 空间复杂度:O(1)(不含输出)

代码实现(Python)

解法一:统计末尾连续 1

python 复制代码
from typing import List

class Solution:
    def minBitwiseArray(self, nums: List[int]) -> List[int]:
        ans = []
        for num in nums:
            if num == 2:
                ans.append(-1)
                continue
            k = 0
            while num & (1 << k):
                k += 1
            ans.append(num - (1 << (k - 1)))
        return ans

解法二:位运算快速定位翻转位

python 复制代码
from typing import List

class Solution:
    def minBitwiseArray(self, nums: List[int]) -> List[int]:
        ans = []
        for num in nums:
            if num == 2:
                ans.append(-1)
                continue
            t = num ^ (num + 1)
            bit = (t + 1) >> 2
            ans.append(num ^ bit)
        return ans

总结与反思

  1. 关键在于"最右侧第一个 0 会被置 1",因此结果以连续 1 结尾。
  2. 可以用位运算快速定位要翻转的那一位
相关推荐
炽烈小老头9 小时前
【每天学习一点算法 2026/04/08】阶乘后的零
学习·算法
Mr_Xuhhh9 小时前
算法刷题笔记:从滑动窗口到哈夫曼编码,我的算法进阶之路
开发语言·算法
MicroTech20259 小时前
突破虚时演化非酉限制:MLGO微算法科技发布可在现有量子计算机运行的变分量子模拟技术
科技·算法·量子计算
唐樽9 小时前
C++ 竞赛学习路线笔记
c++·笔记·学习
hssfscv9 小时前
软件设计师下午题六——Java的各种设计模式
java·算法·设计模式
珂朵莉MM9 小时前
第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第3赛季优化题--多策略混合算法
人工智能·算法
罗西的思考9 小时前
【OpenClaw】通过 Nanobot 源码学习架构---(6)Skills
人工智能·深度学习·算法
枫叶林FYL9 小时前
【自然语言处理 NLP】7.2 红队测试与对抗鲁棒性(Red Teaming & Adversarial Robustness)
人工智能·算法·机器学习
qiqsevenqiqiqiqi9 小时前
字符串模板
算法
bobasyu9 小时前
Claude Code 源码笔记 -- queryLoop
java·笔记·spring