经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
2024-06-19:用go语言,给定一个起始下标为 0 的整数数组 nums 和一个整数 k, 可以执行一个操作将相邻两个元素按位AND后替换为结果。 要求在最多执行 k 次操作的情况下, 计算数组
来源:cnblogs  作者:福大大架构师每日一题  时间:2024/6/19 17:27:13  对本文有异议

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完整代码如下:

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func minOrAfterOperations(nums []int, k int) (ans int) {
  6. mask := 0
  7. for b := 29; b >= 0; b-- {
  8. mask |= 1 << b
  9. cnt := 0 // 操作次数
  10. and := -1 // -1 的二进制全为 1
  11. for _, x := range nums {
  12. and &= x & mask
  13. if and != 0 {
  14. cnt++ // 合并 x,操作次数加一
  15. } else {
  16. and = -1 // 准备合并下一段
  17. }
  18. }
  19. if cnt > k {
  20. ans |= 1 << b // 答案的这个比特位必须是 1
  21. mask ^= 1 << b // 后面不考虑这个比特位
  22. }
  23. }
  24. return
  25. }
  26. func main() {
  27. nums := []int{3, 5, 3, 2, 7}
  28. k := 2
  29. fmt.Println(minOrAfterOperations(nums, k))
  30. }

在这里插入图片描述

Python完整代码如下:

  1. # -*-coding:utf-8-*-
  2. def min_or_after_operations(nums, k):
  3. ans = 0
  4. mask = 0
  5. for b in range(29, -1, -1):
  6. mask |= 1 << b
  7. cnt = 0 # 操作次数
  8. and_op = -1 # -1 的二进制全为 1
  9. for x in nums:
  10. and_op &= x & mask
  11. if and_op != 0:
  12. cnt += 1 # 合并 x,操作次数加一
  13. else:
  14. and_op = -1 # 准备合并下一段
  15. if cnt > k:
  16. ans |= 1 << b # 答案的这个比特位必须是 1
  17. mask ^= 1 << b # 后面不考虑这个比特位
  18. return ans
  19. nums = [3, 5, 3, 2, 7]
  20. k = 2
  21. print(min_or_after_operations(nums, k))

在这里插入图片描述

原文链接:https://www.cnblogs.com/moonfdd/p/18256759

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号