2025-01-08:找到按位或最接近 K 的子数组。用go语言,给定一个数组 nums 和一个整数 k,你的目标是找到一个子数组,使得该子数组中所有元素进行按位或运算后的结果与 k 之间的绝对差值尽

news/2025/1/8 13:22:31/文章来源:https://www.cnblogs.com/moonfdd/p/18659525

2025-01-08:找到按位或最接近 K 的子数组。用go语言,给定一个数组 nums 和一个整数 k,你的目标是找到一个子数组,使得该子数组中所有元素进行按位或运算后的结果与 k 之间的绝对差值尽量小。

具体地,你需要确定一个子数组 nums[l..r],使得以下表达式的值最小化:

|k - (nums[l] OR nums[l + 1] ... OR nums[r])|

最后,返回这个最小绝对差值。

这里所说的子数组指的是数组中连续的非空元素序列。

1 <= nums.length <= 100000。

1 <= nums[i] <= 1000000000。

1 <= k <= 1000000000。

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

输出:0。

解释:

子数组 nums[0..1] 的按位 OR 运算值为 3 ,得到最小差值 |3 - 3| = 0 。

答案2025-01-08:

chatgpt

题目来自leetcode3171。

大体步骤如下:

1.初始化 bitsMaxPos 数组,用于记录每个元素在每位上的最大位置,初始值为 -1。
2.初始化结果 res 为整数最大值 math.MaxInt
3.遍历数组 nums

a. 对于每个元素,记录其在 bitsMaxPos 数组中每位上的位置,即进行按位运算并更新 bitsMaxPos

b. 构建二维数组 posToBit,记录每个位的最大位置和该位的值。

c. 按照每位最大位置倒序排序 posToBit 数组。

d. 遍历 posToBit 数组,计算包含当前位的所有可能组合的按位或值,更新结果 res

4.最终返回 res 作为最小绝对差值。

总体而言,这个算法的时间复杂度取决于数组长度 n,其中对数组进行了遍历和排序操作。

额外空间复杂度主要取决于辅助数组的大小和额外变量的空间开销,约为 O(n)。

Go完整代码如下:

package mainimport ("fmt""sort""math"
)func minimumDifference(nums []int, k int) int {n := len(nums)bitsMaxPos := make([]int, 31)for i := range bitsMaxPos {bitsMaxPos[i] = -1}res := math.MaxIntfor i := 0; i < n; i++ {for j := 0; j <= 30; j++ {if nums[i]>>j & 1 == 1 {bitsMaxPos[j] = i}}posToBit := make([][2]int, 0)for j := 0; j <= 30; j++ {if bitsMaxPos[j] != -1 {posToBit = append(posToBit, [2]int{bitsMaxPos[j], j})}}sort.Slice(posToBit, func(a, b int) bool {return posToBit[a][0] > posToBit[b][0]})val := 0for j, p := 0, 0; j < len(posToBit); p = j {for j < len(posToBit) && posToBit[j][0] == posToBit[p][0] {val |= 1 << posToBit[j][1]j++}res = min(res, int(math.Abs(float64(val - k))))}}return res
}func main() {nums := []int{1,2,4,5}k := 3result := minimumDifference(nums,k)fmt.Println(result)
}

在这里插入图片描述

Rust完整代码如下:

use std::cmp;
use std::collections::HashSet;fn minimum_difference(nums: Vec<i32>, k: i32) -> i32 {let n = nums.len();let mut bits_max_pos = [-1; 31];let mut res = i32::MAX;for i in 0..n {for j in 0..=30 {if nums[i] >> j & 1 == 1 {bits_max_pos[j] = i as i32;}}let mut pos_to_bit: Vec<(i32, i32)> = Vec::new();for j in 0..=30 {if bits_max_pos[j] != -1 {pos_to_bit.push((bits_max_pos[j], j as i32));}}pos_to_bit.sort_by(|a, b| b.0.cmp(&a.0));let mut val = 0;let mut j = 0;let mut p = 0;while j < pos_to_bit.len() {p = j;while j < pos_to_bit.len() && pos_to_bit[j].0 == pos_to_bit[p].0 {val |= 1 << pos_to_bit[j].1;j += 1;}res = cmp::min(res, (val - k).abs() as i32);}}res
}fn main() {let nums = vec![1, 2, 4, 5];let k = 3;let result = minimum_difference(nums, k);println!("{}", result);
}

在这里插入图片描述

C完整代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>// Helper function to find the minimum of two integers
int min(int a, int b) {return (a < b) ? a : b;
}int minimumDifference(int nums[], int size, int k) {int bitsMaxPos[31];for (int i = 0; i < 31; i++) {bitsMaxPos[i] = -1;}int res = INT_MAX;for (int i = 0; i < size; i++) {for (int j = 0; j <= 30; j++) {if ((nums[i] >> j) & 1 == 1) {bitsMaxPos[j] = i;}}int posToBit[size][2];int count = 0;for (int j = 0; j <= 30; j++) {if (bitsMaxPos[j] != -1) {posToBit[count][0] = bitsMaxPos[j];posToBit[count][1] = j;count++;}}// Sortfor (int a = 0; a < count; a++) {for (int b = a+1; b < count; b++) {if (posToBit[a][0] < posToBit[b][0]) {int temp0 = posToBit[a][0];int temp1 = posToBit[a][1];posToBit[a][0] = posToBit[b][0];posToBit[a][1] = posToBit[b][1];posToBit[b][0] = temp0;posToBit[b][1] = temp1;}}}int val = 0;for (int j = 0, p = 0; j < count; p = j) {while (j < count && posToBit[j][0] == posToBit[p][0]) {val |= 1 << posToBit[j][1];j++;}res = min(res, abs(val - k));}}return res;
}int main() {int nums[] = {1, 2, 4, 5};int size = sizeof(nums) / sizeof(nums[0]);int k = 3;int result = minimumDifference(nums, size, k);printf("%d\n", result);return 0;
}

在这里插入图片描述

C++完整代码如下:

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <climits>int min(int a, int b) {return (a < b) ? a : b;
}int minimumDifference(std::vector<int> nums, int k) {int n = nums.size();std::vector<int> bitsMaxPos(31, -1);int res = INT_MAX;for (int i = 0; i < n; i++) {for (int j = 0; j <= 30; j++) {if ((nums[i] >> j) & 1 == 1) {bitsMaxPos[j] = i;}}std::vector<std::pair<int, int>> posToBit;for (int j = 0; j <= 30; j++) {if (bitsMaxPos[j] != -1) {posToBit.push_back(std::make_pair(bitsMaxPos[j], j));}}std::sort(posToBit.begin(), posToBit.end(), [](const std::pair<int, int>& a, const std::pair<int, int>& b) {return a.first > b.first;});int val = 0;for (int j = 0, p = 0; j < posToBit.size(); p = j) {while (j < posToBit.size() && posToBit[j].first == posToBit[p].first) {val |= 1 << posToBit[j].second;j++;}res = min(res, std::abs(val - k));}}return res;
}int main() {std::vector<int> nums = {1, 2, 4, 5};int k = 3;int result = minimumDifference(nums, k);std::cout << result << std::endl;return 0;
}

在这里插入图片描述

Python完整代码如下:

# -*-coding:utf-8-*-import mathdef minimum_difference(nums, k):n = len(nums)bits_max_pos = [-1] * 31res = math.inffor i in range(n):for j in range(31):if nums[i] >> j & 1 == 1:bits_max_pos[j] = ipos_to_bit = []for j in range(31):if bits_max_pos[j] != -1:pos_to_bit.append((bits_max_pos[j], j))pos_to_bit.sort(key=lambda x: x[0], reverse=True)val = 0j = 0p = 0while j < len(pos_to_bit):p = jwhile j < len(pos_to_bit) and pos_to_bit[j][0] == pos_to_bit[p][0]:val |= 1 << pos_to_bit[j][1]j += 1res = min(res, abs(val - k))return resif __name__ == "__main__":nums = [1, 2, 4, 5]k = 3result = minimum_difference(nums, k)print(result)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/865841.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工程师必看~功耗表现最佳模组:Air780EPS!

今天一起来聊聊Air780EPS模组~ 一、Air780EPS核心信息描述 软件开发: Air780EPS软件上既支持传统的AT指令,也支持基于Lua脚本开发的嵌入操作系统LuatOS。 外设支持: Air780EPS硬件上支持丰富的外设管脚,比如USB、UART、SPI、I2C、PWM、GPIO等。 网络协议: 支持丰富的网络协…

一篇解决:TCP断链续连问题!

一、TCP断链续连示例 TCP(传输控制协议)主要用于确保数据在网络中可靠传输。当TCP连接因网络问题、设备故障等原因断开时,需要重新建立连接以继续数据传输。 本文将通过Air201具体示例解析,教你使用LuatOS脚本语言实现TCP断链续连。 1.1 本教程实现的功能定义: 1)断链: …

使用PPP拨号的方式——快速实现USB上网!

今天一起来看看,如何使用PPP拨号的方式快速实现USB上网。 一、Windows下PPP拨号 1.1 配置标准调制解调器 1)选择COM口 具体操作如下: 打开控制面板—>电话和调制解调器—>调制解调器—>添加—>选择标准33600bps调制解调器—>选择COM口。2)修改波特率 具体操…

BOS或客户端清理服务器设置历史记录

1、客户端服务器设置中“清除全部记录”2、反编译Kingdee.BOS.IDE.exe, 查找配置文件修改, C:\Users\HUAXIN\Documents\Kingdee\K3Cloud\LoginInfo.xml

R语言系列—R语言简介及安装

同学们,大家好,今天开始开设一个新系列,R语言系列,对生信分析中涉及到的R语言代码及R语言绘图进行详细讲解,感兴趣的同学可以重点关注一下。 什么是R语言?R语言是用于统计分析、绘图的语言和操作环境。R语言是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用…

146. LRU 缓存(中)

目录题目法一、Map法二、双向链表 题目法一、Map对于超出容量时,删除最久未使用的关键字:在进行put和get时,只要存在就先删再重新放入map,保证了最久未使用的关键字处于map的第一个/*** @param {number} capacity*/ var LRUCache = function(capacity) {this.capacity = ca…

Linux使用dmidecode来查看机器有几根内存插槽,哪个槽上有内存

直接输入dmidecode即可,输出有很多,好像是根据SM总线来查询的,包括能查询到BIOS的地址空间和其中的信息等等,内存信息只是其中的一部分。摘录如下: dmidecode -t memory从这段输出可以看出,第一个Physical Memory Array是总体的内存信息,从这里可以看到有四个内存插槽、…

告别混乱!电商新年团队协作工具助你轻松应战

新年期间电商团队面临着巨大的工作量,而看板软件凭借其任务的可视化与分配、进度的实时跟踪与更新、沟通与协作的强化、个性化与定制化的满足以及多平台支持与便捷的移动办公等功能,成为了团队高效协作与沟通的得力助手,确保了电商业务在新年期间的平稳运行。看板软件凭借其…

整车电性能测试服务及设备开发

随着车辆电气化程度越来越高,整车电气系统面对更加严苛的工作环境,如何保障整车的电气可靠性越来越得到主机厂的关注。整车电性能测试是汽车电气系统开发过程中的一个关键环节,经纬恒润结合多年的整车电气工程经验,深度分解“整车-系统-子系统-部件-信号”等多个级别的性能…

springboot+shardingsphere实现读写分离和分表

参考:https://blog.csdn.net/weixin_44606481/article/details/140955787 前提:数据库配置了主从数据同步 1、依赖 <dependencies><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boo…

uniapp 荣耀手机 没有检测到设备 运行到Android手机 真机运行

背景: 使用uniapp框架搭建的项目,开发的时候在浏览器运行,因为项目要打包成App,所以需要真机联调,需要运行到Android手机,在手机上查看/运行项目。通过真机调试才能确保软件开发的准确性和页面显示的完整性。操作步骤:1.Usb连接手机和电脑,电脑上的HbuilderX打开项目;…

DC-5 靶场通关小记

rustscan端口扫描指纹识别、LFI漏洞+文件包含(nginx日志)GetShell、screen-4.5.0提权地址 https://www.vulnhub.com/entry/dc-5,314/环境配置 有兼容性问题参考 https://www.cnblogs.com/lrui1/p/18655388 信息收集 ./rustscan -a 192.168.74.130 -- -A -sC Open 192.168.74.13…