网易首页 > 网易号 > 正文 申请入驻

2026-07-12:达到目标异或值的最少删除次数。用go语言,给定一个整数数组 nums 和一个整数 target。 你可以从 nums 里删除任意多个元素(

0
分享至

2026-07-12:达到目标异或值的最少删除次数。用go语言,给定一个整数数组 nums 和一个整数 target。

你可以从 nums 里删除任意多个元素(也可以一个都不删)。删除之后,剩下的元素组成一个新数组。要求:这个新数组所有元素的“按位异或”结果必须等于 target。

请计算达到上述条件所需的最少删除次数。如果无论怎么删除都无法让剩余元素的按位异或结果等于 target,则返回 -1。

注意:如果你把数组删空,那么空数组的按位异或结果规定为 0。

1 <= nums.length <= 40。

0 <= nums[i] <= 10000。

0 <= target <= 10000。

输入: nums = [1,2,3], target = 2。

输出: 1。

解释:

移除 nums[1] = 2 后剩余 [nums[0], nums[2]] = [1, 3]。

[1, 3] 的异或和为 2,等于 target。

无法在少于 1 次移除的情况下达到异或和 = 2,因此答案为 1。

题目来自力扣3877。

一、代码整体思路分步拆解 步骤1:计算数组最大值的二进制位数,确定状态空间大小

  1. 1. 先找出数组中最大数字maxVal

  2. 2. 用bits.Len获取maxVal二进制所占位数m

  3. 3. 状态数组长度为1 << m(2的m次方),代表所有可能出现的异或结果;

  4. 4. 提前判断边界:若最大能覆盖的异或值域上限1< 都小于 target,直接返回-1(不可能凑出目标值)。

步骤2:初始化DP状态数组f

f[xorVal]的含义:能凑出异或值为xorVal的子集,最多包含多少个元素

  1. 1. 分配长度为1< 的数组f;

  2. 2. 全部初始化为极小值math.MinInt,代表该异或值暂时无法构造;

  3. 3.f[0] = 0:空子集异或为0,包含0个元素,是初始合法状态。

步骤3:遍历数组每个数字,逐维更新DP(01背包异或DP)

这是标准01背包型异或动态规划,每个数字只有两种选择:保留 / 删除。
对数组中每一个数字x,执行完整一轮状态更新:

  1. 1. 复制当前完整DP数组f得到临时数组nfnf代表「不选当前x」的所有状态(不修改原始f,避免同轮重复选取同一个x);

  2. 2. 遍历每一个已存在的异或状态j

  • • 若f[j]是极小值,说明该异或值无法构造,直接跳过;

  • • 若选择保留当前数字x,新异或值为j ^ x,新子集元素数量为f[j] + 1

  • • 对比nf[j^x]和新数量,取更大值存入nf[j^x]:保证每个异或值记录最多元素个数

3. 遍历完成后,将临时数组nf赋值给f,完成当前数字的决策更新。

逻辑说明(选/不选分支)

  • • 不选x:状态不变,直接继承复制出来的nf;

  • • 选x:在原有异或j基础上异或x,元素数量+1;
    一轮循环同时覆盖两种选择,保证每个元素只选一次,符合子集定义。

步骤4:判断是否存在合法子集,计算最少删除次数
  1. 1. 读取f[target]:该值是凑出异或target的最大元素数量;

  2. 2. 若f[target] < 0:不存在任何子集满足异或等于target,返回-1;

  3. 3. 最少删除次数 = 总元素个数len(nums)− 最多保留元素f[target]

步骤5:样例推演(nums=[1,2,3], target=2)
  1. 1. 数组最大值为3,二进制占2位,m=2,状态数组长度1<<2=4,值域0~3,target=2在范围内;

  2. 2. 初始化 f = [0, -inf, -inf, -inf];

  3. 3. 处理第一个数字 x=1:

  • • 复制nf初始等于f;

  • • 遍历j=0,f[j]=0;新异或0^1=1,数量0+1=1;nf[1]更新为1;

  • • 更新后 f = [0, 1, -inf, -inf];

4. 处理第二个数字 x=2:

  • • 复制nf = [0,1,-inf,-inf];

  • • j=0:0^2=2,数量1 → nf[2]=1;

  • • j=1:1^2=3,数量2 → nf[3]=2;

  • • 更新后 f = [0,1,1,2];

5. 处理第三个数字 x=3:

  • • 复制nf = [0,1,1,2];

  • • j=0:0^3=3,数量1,当前nf[3]=2更大,不更新;

  • • j=1:1^3=2,数量1+1=2,比原nf[2]=1更大,nf[2]=2;

  • • j=2:2^3=1,数量1+1=2,比原nf[1]=1更大,nf[1]=2;

  • • j=3:3^3=0,数量2+1=3,比原nf[0]=0更大,nf[0]=3;

  • • 最终 f = [3, 2, 2, 2];

6. 查询f[target=2] = 2,总长度3;最少删除 = 3 - 2 = 1,和样例输出一致。

二、时间复杂度分析

设:

  • • n = nums数组长度(最多40)

  • • S = 状态总数 = 2^m,m为数组最大值二进制位数;nums[i]≤10000,10000二进制约14位,S ≤ 2^14 = 16384。

完整流程时间开销:

  1. 1. 求数组最大值:O(n);

  2. 2. DP数组初始化:O(S);

  3. 3. 遍历每个数字(n轮):

  • • 克隆DP数组:O(S);

  • • 遍历全部S个状态更新:O(S);
    单轮总 O(S),n轮合计 O(n × S);

总时间复杂度:O(n × 2^m)
代入上限:n=40,2^14=16384,总运算量约40 × 16384 = 655360,计算量极小。

三、额外空间复杂度分析

  1. 1. DP主数组f:长度 S = 2^m,占用 O(S);

  2. 2. 每轮临时数组nf是f的完整拷贝,同时存在两份长度S的数组;

  3. 3. 其余临时变量、循环变量空间可忽略;

总额外空间复杂度:O(2^m)
上限为2^14=16384个int,空间开销极低。

Go完整代码如下:

package main

import (
"fmt"
"math"
"math/bits"
"slices"
)

func minRemovals(nums []int, target int)int {
m := bits.Len(uint(slices.Max(nums)))
if1<
return -1
}

f := make ([] int , 1 <
for i := range f {
f[i] = math.MinInt
}
f[ 0 ] = 0

for _, x := range nums {
nf := slices.Clone(f)
for j, fj := range f {
nf[j^x] = max(nf[j^x], fj+ 1 ) // x 不选 or 选
}
f = nf
}

if f[target] < 0 {
return -1
}
return len (nums) - f[target]
}

func main() {
nums := [] int { 1 , 2 , 3 }
target := 2
result := minRemovals(nums, target)
fmt.Println(result)
}

Python完整代码如下:

# -*-coding:utf-8-*-

from typing import List
import math

def minRemovals(nums: List[int], target: int) -> int:
# 计算 nums 中最大值需要的二进制位数
max_num = max(nums) if nums else0
m = max_num.bit_length()
# 如果所有可能异或值的范围小于等于 target,则无法达到 target
if (1 << m) <= target:
return-1
# dp数组,f[state] 表示异或结果为 state 时最多能选择的数字个数
# 初始化为极小值
f = [-math.inf] * (1 << m)
f[0] = 0
for x in nums:
# 复制当前dp状态
nf = f.copy()
for j, fj in enumerate(f):
if fj != -math.inf: # 只处理可达状态
new_state = j ^ x
nf[new_state] = max(nf[new_state], fj + 1)
f = nf
# 如果 target 不可达
if f[target] < 0:
return-1
# 最少移除数 = 总长度 - 最多保留数
returnlen(nums) - f[target]

def main():
nums = [1, 2, 3]
target = 2
result = minRemovals(nums, target)
print(result)

if __name__ == "__main__":
main()

C++完整代码如下:

  





using namespace std;

int minRemovals(vector& nums, int target) {
// 计算 nums 中最大值需要的二进制位数
int maxNum = *max_element(nums.begin(), nums.end());
int m = 0;
while ((1 << m) <= maxNum) {
m++;
}

// 如果所有可能异或值的范围小于等于 target,则无法达到 target
if ((1 << m) <= target) {
return-1;
}

// dp数组,f[state] 表示异或结果为 state 时最多能选择的数字个数
// 初始化为极小值
int size = 1 << m;
vector f(size, INT_MIN);
f[0] = 0;

for (int x : nums) {
// 复制当前dp状态
vector nf = f;
for (int j = 0; j < size; j++) {
if (f[j] != INT_MIN) { // 只处理可达状态
int newState = j ^ x;
nf[newState] = max(nf[newState], f[j] + 1);
}
}
f = nf;
}

// 如果 target 不可达
if (f[target] < 0) {
return-1;
}

// 最少移除数 = 总长度 - 最多保留数
return nums.size() - f[target];
}

int main() {
vector nums = {1, 2, 3};
int target = 2;
int result = minRemovals(nums, target);
cout << result << endl;
return0;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
周星驰问张艺兴:下次我还找你拍戏 , 零片酬行吗 ? 张艺兴回应显情商

周星驰问张艺兴:下次我还找你拍戏 , 零片酬行吗 ? 张艺兴回应显情商

观察鉴娱
2026-07-13 09:40:18
法媒:奥利塞希望今夏加盟皇马,拜仁至少索要2亿欧元

法媒:奥利塞希望今夏加盟皇马,拜仁至少索要2亿欧元

懂球帝
2026-07-15 22:47:33
阿尔维斯:我靠上帝和足球赚了数百万欧,但在监狱里我更快乐

阿尔维斯:我靠上帝和足球赚了数百万欧,但在监狱里我更快乐

懂球帝
2026-07-15 15:53:19
一个组织开始官僚化的信号:所有事情都要留痕

一个组织开始官僚化的信号:所有事情都要留痕

细说职场
2026-07-13 18:02:49
民众党青年团赴陆后,台陆委会回应,向大陆提一个要求,不简单

民众党青年团赴陆后,台陆委会回应,向大陆提一个要求,不简单

DS北风
2026-07-15 12:02:13
8TB西数红盘降价近100美元,NAS扩容好时机

8TB西数红盘降价近100美元,NAS扩容好时机

我是一个养虾人
2026-07-16 00:17:14
19年张扣扣被执行死刑当天,被害者家属语出惊人,当庭说出8个字

19年张扣扣被执行死刑当天,被害者家属语出惊人,当庭说出8个字

麓谷隐士
2026-07-13 10:05:15
观天下丨海峡通行费“秒变”投资协议 美媒披露内情

观天下丨海峡通行费“秒变”投资协议 美媒披露内情

中国网
2026-07-15 17:50:56
刚自证清白人就没了!荷兰足协发悼念:38岁世界杯裁判家中身亡

刚自证清白人就没了!荷兰足协发悼念:38岁世界杯裁判家中身亡

潇湘烟雨水
2026-07-15 03:24:30
谈崩了!5年1.25亿!最快速度交易

谈崩了!5年1.25亿!最快速度交易

篮球教学论坛
2026-07-15 12:39:26
张靓颖与冯轲相爱15年,被骗走亿万身家,离婚8年后两人天差地别

张靓颖与冯轲相爱15年,被骗走亿万身家,离婚8年后两人天差地别

一盅情怀
2026-07-14 16:03:54
她也不续约了!还将成立个人公司独立

她也不续约了!还将成立个人公司独立

奋斗在韩国
2026-07-15 10:01:03
大胆预测!明早阿根廷VS英格兰,潘帕斯雄鹰将取胜,原因有4点

大胆预测!明早阿根廷VS英格兰,潘帕斯雄鹰将取胜,原因有4点

江启
2026-07-15 14:41:02
俄顶级富豪突然发出警告:未来可能有四条路,中国是最大的威胁?

俄顶级富豪突然发出警告:未来可能有四条路,中国是最大的威胁?

风干迷茫人
2026-07-15 05:39:17
隆基绿能副总裁:国家已在用技术手段出清光伏产能,明年过剩格局会有很大改善

隆基绿能副总裁:国家已在用技术手段出清光伏产能,明年过剩格局会有很大改善

界面新闻
2026-07-15 18:20:30
甜蜜!里夫斯女友晒出约会照:你可以在高尔夫球场找到我们

甜蜜!里夫斯女友晒出约会照:你可以在高尔夫球场找到我们

东方不败然多多
2026-07-16 00:58:29
央视将播!55集历史大剧来了!于和伟、王劲松领衔,这剧不爆都难

央视将播!55集历史大剧来了!于和伟、王劲松领衔,这剧不爆都难

草本纪年
2026-07-13 19:19:29
比石油便宜!中国正用“没人要”的竹子,把全球石油桌子掀翻?

比石油便宜!中国正用“没人要”的竹子,把全球石油桌子掀翻?

阿伧说事
2026-07-15 18:13:36
排面拉满!NBA官方+埃文特纳盛赞杨瀚森 获专属帅气昵称

排面拉满!NBA官方+埃文特纳盛赞杨瀚森 获专属帅气昵称

林子说事
2026-07-15 12:47:05
如果牛顿的贡献值是100,爱因斯坦是90,那么杨振宁大概是多少?

如果牛顿的贡献值是100,爱因斯坦是90,那么杨振宁大概是多少?

大运河时空
2026-07-14 14:25:03
2026-07-16 01:36:49
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1337文章数 71关注度
往期回顾 全部

科技要闻

国行大突破!“Apple智能”已备案

头条要闻

美国要“彻底瓦解”国际刑事法院 日本慌了

头条要闻

美国要“彻底瓦解”国际刑事法院 日本慌了

体育要闻

世界杯两大巨星,加一起22岁

娱乐要闻

大S遗嘱曝光!S家拒不承认

财经要闻

梁文锋身家2400亿登顶全球AI首富

汽车要闻

爱玩会玩 小鹏MONA L03这次来势凶猛

态度原创

艺术
亲子
游戏
家居
公开课

艺术要闻

时尚圈集体破防:夏威夷画家用一支笔,干翻了价值百万的摄影棚大片

亲子要闻

小汽车乱丢车轮 #工程车玩具#儿童动画

大司马人气重回巅峰,播LOL怀旧服人气突破10万+,老版本情怀拉满!

家居要闻

2026建博会(广州) 公装联探展交流活动

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版