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


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

date: 2026-01-20

tags:

  • 算法学习
  • LeetCode
  • 位运算

题目信息


题目描述

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


初步思路

  1. 观察 x | (x + 1):它会把 x 的"最右侧第一个 0"变成 1,因此结果必然以连续的 1 结尾。
  2. 若 y = numsi,设 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. 可以用位运算快速定位要翻转的那一位
相关推荐
问心无愧05137 小时前
ctf show web入门111
android·前端·笔记
小欣加油8 小时前
leetcode56 合并区间
c++·算法·leetcode·职场和发展
lqqjuly8 小时前
前沿算法深度解析(二)
人工智能·算法·机器学习
徐小夕9 小时前
万字长文!千万级文档 RAG 知识库系统落地实践
前端·算法·github
akunkuntaimei9 小时前
2026年高考数学各省真题及答案(完整版)
算法·高考
Hello:CodeWorld10 小时前
C 风格变参 vs C++ 变参模板:核心区别与选型指南
c语言·c++·算法
8Qi811 小时前
LeetCode 516:最长回文子序列
算法·leetcode·职场和发展·动态规划
和平宇宙11 小时前
AI笔记005. hermes-DeepSeek V4 Pro, 128K上下文引发的探索
前端·人工智能·笔记
十月的皮皮12 小时前
C语言学习笔记20260606- 求月份天数三种写法
c语言·笔记·学习
cmes_love12 小时前
Level 2逐笔成交历史数据下载方法笔记
数据库·笔记·oracle