2024-06-19:用go语言,给定一个起始下标为 0 的整数数组 nums 和一个整数 k, 可以执行一个操作将相邻两个元素按位AND后替换为结果。 要求在最多执行 k 次操作的情况下, 计算数组

go,nums,and · 浏览次数 : 0

小编点评

题目分析: 给定一个整数数组nums和整数k,要求在最多执行k次操作的情况下,计算数组中所有元素按位OR后的最小值。 解题思路: 1. 定义变量mask,初始为0,用于保存当前考虑的比特位。 2. 定义变量cnt和and,初始化为0和-1,分别表示操作次数和前一次合并后的结果。 3. 遍历数组nums,按照从最高位到最低位的顺序,对每个比特位进行处理。 a. 将当前比特位设置为1,并记录操作次数。 b. 对数组中的每个元素进行按位与操作,并将结果保存到and中。 c. 如果and不为0,说明可以继续合并下一个元素,操作次数加1;否则,重置and为-1,准备合并下一段。 d. 如果操作次数超过k,说明已经无法完成操作,跳出循环。 e. 根据当前比特位的结果,更新答案ans,并更新mask。 4. 返回答案ans。 时间复杂度:O(N),其中N为数组的长度,因为对每个元素进行了一次遍历。 额外空间复杂度:O(1),因为只使用了常数个额外变量来存储操作的中间结果,没有使用随数组长度变化的额外空间。 Go代码实现: ```go func minOrAfterOperations(nums []int, k int) (ans int) { mask := 0 for b := 29; b >= 0; b-- { mask |= 1 << b cnt := 0 // 操作次数 and := -1 // -1的二进制全为1 for _, x := range nums { and &= x & mask if and != 0 { cnt++ } else { and = -1 } } if cnt > k { ans |= 1 << b mask ^= 1 << b } } return } func main() { nums := []int{3, 5, 3, 2, 7} k := 2 fmt.Println(minOrAfterOperations(nums, k)) } ``` Python代码实现: ```python def min_or_after_operations(nums, k): ans = 0 mask = 0 for b in range(29, -1, -1): mask |= 1 << b cnt = 0 # 操作次数 and_op = -1 # -1的二进制全为1 for x in nums: and_op &= x & mask if and_op != 0: cnt += 1 else: and_op = -1 if cnt > k: ans |= 1 << b mask ^= 1 << b return ans nums = [3, 5, 3, 2, 7] k = 2 print(min_or_after_operations(nums, k)) ```

正文

2024-06-19:用go语言,给定一个起始下标为 0 的整数数组 nums 和一个整数 k,

可以执行一个操作将相邻两个元素按位AND后替换为结果。

要求在最多执行 k 次操作的情况下,

计算数组中所有元素按位OR后的最小值。

输入:nums = [3,5,3,2,7], k = 2。

输出:3。

解释:执行以下操作:

1.将 nums[0] 和 nums[1] 替换为 (nums[0] & nums[1]) ,得到 nums 为 [1,3,2,7] 。

2.将 nums[2] 和 nums[3] 替换为 (nums[2] & nums[3]) ,得到 nums 为 [1,3,2] 。

最终数组的按位或值为 3 。

3.是 k 次操作以内,可以得到的剩余元素的最小按位或值。

答案2024-06-19:

chatgpt

题目来自leetcode3022。

大体步骤如下:

1.使用一个循环从最高位(第 29 位)到最低位(第 0 位)来考虑每个比特位。

2.对于每个比特位 b,首先创建一个掩码 mask,初始为 0。在每次循环中通过将 1 左移 b 位来设置当前考虑的比特位为 1。

3.创建计数变量 cnt 来记录操作次数,初始设为 0。也创建一个变量 and 初始化为 -1(所有位均为 1)。

4.遍历数组中的每个数字 x:

  • 将当前 and 与 x 按位与并存储结果到 and 中。

  • 如果 and 不为 0,增加操作次数 cnt;否则重置 and 为 -1,准备处理下一段。

5.如果计数 cnt 大于 k,则将答案 ans 的第 b 位设置为 1,同时更新掩码 mask,排除当前位。

6.重复以上步骤直至处理到最低位(第 0 位)。

7.返回最终结果 ans,即所有元素按位 OR 后的最小值。

总的时间复杂度:O(N), 其中 N 为数组的长度,因为对每个元素进行了一次遍历。
总的额外空间复杂度:O(1),因为只使用了常数个额外变量来存储操作的中间结果,没有使用随数组长度变化的额外空间。

Go完整代码如下:

package main

import (
	"fmt"
)

func minOrAfterOperations(nums []int, k int) (ans int) {
	mask := 0
	for b := 29; b >= 0; b-- {
		mask |= 1 << b
		cnt := 0  // 操作次数
		and := -1 // -1 的二进制全为 1
		for _, x := range nums {
			and &= x & mask
			if and != 0 {
				cnt++ // 合并 x,操作次数加一
			} else {
				and = -1 // 准备合并下一段
			}
		}
		if cnt > k {
			ans |= 1 << b  // 答案的这个比特位必须是 1
			mask ^= 1 << b // 后面不考虑这个比特位
		}
	}
	return
}

func main() {
	nums := []int{3, 5, 3, 2, 7}
	k := 2
	fmt.Println(minOrAfterOperations(nums, k))
}

在这里插入图片描述

Python完整代码如下:

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

def min_or_after_operations(nums, k):
    ans = 0
    mask = 0
    for b in range(29, -1, -1):
        mask |= 1 << b
        cnt = 0  # 操作次数
        and_op = -1  # -1 的二进制全为 1
        for x in nums:
            and_op &= x & mask
            if and_op != 0:
                cnt += 1  # 合并 x,操作次数加一
            else:
                and_op = -1  # 准备合并下一段
        if cnt > k:
            ans |= 1 << b  # 答案的这个比特位必须是 1
            mask ^= 1 << b  # 后面不考虑这个比特位
    return ans

nums = [3, 5, 3, 2, 7]
k = 2
print(min_or_after_operations(nums, k))

在这里插入图片描述

与2024-06-19:用go语言,给定一个起始下标为 0 的整数数组 nums 和一个整数 k, 可以执行一个操作将相邻两个元素按位AND后替换为结果。 要求在最多执行 k 次操作的情况下, 计算数组相似的内容:

2024-06-19:用go语言,给定一个起始下标为 0 的整数数组 nums 和一个整数 k, 可以执行一个操作将相邻两个元素按位AND后替换为结果。 要求在最多执行 k 次操作的情况下, 计算数组

2024-06-19:用go语言,给定一个起始下标为 0 的整数数组 nums 和一个整数 k, 可以执行一个操作将相邻两个元素按位AND后替换为结果。 要求在最多执行 k 次操作的情况下, 计算数组中所有元素按位OR后的最小值。 输入:nums = [3,5,3,2,7], k = 2。 输出:3

【VyOS-开源篇-3】- container for vyos 搭建 Halo 博客-vyos-开源篇

title: 【Vyos-开源篇-3】- container for vyos 搭建 Halo 博客 date: 2024-01-17 19:41:31.774 updated: 2024-01-18 17:16:06.788 url: https://yangpin.link/archives/1

2024-06-15:用go语言,Alice 和 Bob 在一个环形草地上玩一个回合制游戏。 草地上分布着一些鲜花,其中 Alice 到 Bob 之间顺时针方向有 x 朵鲜花,逆时针方向有 y 朵鲜花

2024-06-15:用go语言,Alice 和 Bob 在一个环形草地上玩一个回合制游戏。 草地上分布着一些鲜花,其中 Alice 到 Bob 之间顺时针方向有 x 朵鲜花,逆时针方向有 y 朵鲜花。 游戏规则如下: 1.游戏从 Alice 开始。 2.每个回合中,当前玩家必须选择顺时针或逆时针,

2024-06-05:用go语言,给定三个正整数 n、x 和 y, 描述一个城市中由 n 个房屋和 n 条街道连接的情况。 城市中存在一条额外的街道连接房屋 x 和房屋 y。 需要计算对于每个街道数(

2024-06-05:用go语言,给定三个正整数 n、x 和 y, 描述一个城市中由 n 个房屋和 n 条街道连接的情况。 城市中存在一条额外的街道连接房屋 x 和房屋 y。 需要计算对于每个街道数(从 1 到 n), 有多少房屋对满足从一个房屋到另一个房屋经过的街道数正好为该街道数。 在结果数组中

文件系统(八):Linux JFFS2文件系统工作原理、优势与局限

liwen01 2024.06.23 前言 在嵌入式Linux设备中,经常使用jffs2文件系统来作为参数区的文件系统格式。至于为什么要使用jffs2来作为参数区的文件系统,我猜大部分人都没有做过多的思考。 jffs2在2021年被设计出来,距今已过二十多年,现在在嵌入式设备中它还在被大量使用、说明

文件系统(七):文件系统崩溃一致性、方法、原理与局限

liwen01 2024.06.16 前言 先提几个问题:什么是文件系统崩溃一致性?为什么会出现文件系统崩溃一致性问题?有哪些方法可以解这个问题?它们各自又有哪些局限性? window系统电脑异常后会蓝屏、手机死机卡顿后我们会手动给它重启,大部分设备的系统在遇到不可修复的严重异常后都会尝试通过重启来

文件系统(六):一文看懂linux ext4文件系统工作原理

liwen01 2024.06.09 前言 Linux系统中的ext2、ext3、ext4 文件系统,它们都有很强的向后和向前兼容性,可以在数据不丢失的情况下进行文件系统的升级。目前ext4是一个相对较成熟、稳定且高效的文件系统,适用于绝大部分规模和需求的Linux环境。 ext4它突出的特点有:数

使用 GPU 进行 Lightmap 烘焙 - 简单 demo

作者:i_dovelemon 日期:2024-06-16 主题:Lightmap, PathTracer, Compute Shader 引言 一直以来,我都对离线 bake lightmap 操作很着迷。一方面,这个方案历久弥新,虽然很古老,但是一直在实际项目中都有使用;另一方面,它能够产生非常高

毕业季,终于毕业了!

2023.10-2024.06十年有余,没想到在一家公司可以干这么久,属于超长期服役。原本3年前掀完桌子就该背包走人的,没想到又赖了三年。公司属于危机自救无奈减兵过冬,在国法的基础上还加了一点点毕业礼包,在这里真心感谢老板、感谢CCTV、MTV、BTV、皇恩浩荡。 从6.18接到人事通知到6.21最

.NET周刊【6月第5期 2024-06-30】

国内文章 呼吁改正《上海市卫生健康信息技术应用创新白皮书》 C# 被认定为A 组件 的 错误认知 https://www.cnblogs.com/shanyou/p/18264292 近日,《上海市卫生健康“信息技术应用创新”白皮书》发布,提到医疗信创核心应用适配方法及公立医院信息系统。文章中对C#