阿里PVC管道管件粘接胶 2026-06-24: 使数组奇偶交替的少操作。用go语言, 给定整数数组

发布日期:2026-06-25 点击次数:91
铁皮保温施工

2026-06-24:使数组奇偶交替的少操作。用go语言,给定整数数组 nums。若对所有相邻位置 i 和 i+1阿里PVC管道管件粘接胶 ,它们的奇偶不同(个为奇数、另个为偶数),则称该数组为“奇偶交替”。你可以对任意下标 i 做次操作:把 nums[i] 加 1 或减 1。

现在要返回两个数:

• answer[0]:把数组调整为“奇偶交替”所需的少操作次数。

• answer[1]:在所有恰好用了 answer[0] 次操作得到“奇偶交替”的结果数组中,max(数组) - min(数组) 能取得的小值。

注意:当数组长度为 1 时,它满足“奇偶交替”条件。

1

-1000000000

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

输出: [2,6]。

解释:

执行以下操作:

将 nums[2] 增加 1,得到 nums = [-2, -3, 2, 4]。

将 nums[3] 减少 1,得到 nums = [-2, -3, 2, 3]。

得到的数组是奇偶交替的,且 max(nums) - min(nums) = 3 - (-3) = 6 是所有使用恰好 2 次操作可获得的奇偶交替数组中的小值。

题目来自力扣3854。

、整体法分步流程

步骤1:前置全局预处理

1. 判断数组长度:输入长度为4≠1,进入主逻辑;

2. 遍历整个数组,求出全局小值gMin=-3、全局大值gMax=4;

作用:当数字需要修改时,控制修改向,用来计修改后新数字,便后续求差。

步骤2:定义通用计函数calc(target)

函数输入0/1两种模板,次出两个结果:

返回值1:该模板需要的总少操作次数op

返回值2:该模板在少操作前提下,修改后数组能达到的小差minD

函数内部完整执行流程:

子步骤2.1 初始化变量

• op=0:统计当前模板总操作次数

• mn=穷大:记录修改后数组所有元素小值

• mx=负穷大:记录修改后数组所有元素大值

子步骤2.2 逐遍历数组每个下标i、原数字x

核心判断条件:(x - i) & 1 != target,等价校验「当前x奇偶是否匹配当前模板要求」:

x奇偶 ^ i奇偶 = target → (x&1) ^ (i&1) = target

(x-i)&1 = (x&1)^(i&1),因此条件不成立代表当前数字奇偶不达标,须修改。

分两种分支处理每个元素:

分支A:当前数字奇偶不匹配模板(需要操作)

1. 操作计数op +=1(仅±1,少代价,不做多次修改);

2. 决定修改后新x的值:

• 如果原x是全局小值gMin:只能+1(如果-1会小,差会变大,为了拿到小差优先往改);

• 如果原x是全局大值gMax:只能-1(如果+1会大,差会变大,优先往小改);

逻辑目的:修改时尽可能压缩数值区间,让终差小。

3. 用修改后的新x,新全局mn、mx(记录当前修改后数组的大、小值)。

分支B:当前数字奇偶匹配模板(需操作)阿里PVC管道管件粘接胶

直接用原x新mn、mx,不增加操作次数。

子步骤2.3 遍历完所有元素后计差

计当前模板修改后数组差:mx - mn;

题目规定数组长度≥2时差至少为1,因此终取max(mx-mn,1)作为该模板的小差minD;

函数返回 (总操作次数op,小差minD)。

步骤3:分别计两种模板的代价

1. 调用calc(0),得到模板0数据:op1、minD1;

2. 调用calc(1),得到模板1数据:op2、minD2;

结示例nums = [-2,-3,1,4]手动演:

数组下标0: -2、下标1: -3、下标2: 1、下标3:4

calc(0)(偶、奇、偶、奇模板)

i=0,x=-2:x偶,i偶,匹配模板0,不操作,mn=-2,mx=-2

i=1,x=-3:x奇,i奇,匹配模板0,不操作,mn=-3,mx=-2

i=2,x=1:x奇,i偶,不匹配,op+1;x不是gMin/gMax,任意±1(示例选+1→2),新x=2,mn=-3,mx=2

i=3,x=4:x偶,i奇,万能胶生产厂家不匹配,op+1;x是gMax=4,只能-1→3,新x=3,mn=-3,mx=3

总op1=2,差3-(-3)=6 → minD1=6

calc(1)(奇、偶、奇、偶模板)

i=0,x=-2偶,i偶,不匹配,op+1;x=gMin=-3?不是,x=-2,±1变-1

i=1,x=-3奇,i奇,不匹配,op+1;±1变-2

i=2,x=1奇,i偶,匹配,操作

i=3,x=4偶,i奇,匹配,操作

总op2=2;修改后数值区间差会大于6,minD2>6

步骤4:对比两套模板,选出优案

对比规则优先:

1. 优先选总操作次数少的模板;

2. 若次数相等,选差小的模板。

示例中op1=op2=2,minD1=6

步骤5:边界兜底逻辑

如果输入数组长度等于1,直接返回[0,0],不执行上述calc计流程。

二、时间复杂度分析

1. 求全局大小值:单次O(n)遍历;

2. calc(0)完整遍历数组O(n),calc(1)完整遍历数组O(n);

总遍历次数:3次线遍历,总运量与数组长度n成正比;

总时间复杂度:O(n)

n大1e5,线复杂度满足数据范围要求。

三、额外空间复杂度分析

1. 仅使用固定数量局部变量:gMin、gMax、op、mn、mx、op1、minD1、op2、minD2等;

2. 没有开辟随n增长的数组、切片、哈希容器;

输出切片固定长度为2,属于常量空间;

总额外空间复杂度:O(1)(常数空间)

Go完整代码如下:

package main阿里PVC管道管件粘接胶

import (

"fmt"

"math"

"slices"

)

func makeParityAlternating(nums []int) []int {

iflen(nums) == 1 {

return []int{0, 0}

}

gMin := slices.Min(nums)

gMax := slices.Max(nums)

calc := func(target int) (int, int) {

op, mn, mx := 0, math.MaxInt, math.MinInt

for i, x := range nums {

// 如果 target = 0,那么操作后,nums 每个数的奇偶须分别等于 0,1,0,1,... 即 target ^ i2

if (x-i)&1 != target { // 等价于 x&1 != target ^ i2

op++

if x == gMin {

x++

} elseif x == gMax {

x--

}

}

mn = min(mn, x)

mx = max(mx, x)

}

return op, max(mx-mn, 1) // 在 n >= 2 的情况下,差至少是 1

}

op1, minD1 := calc(0)

op2, minD2 := calc(1)

if op1

return []int{op1, minD1}

}

return []int{op2, minD2}

}

func main {

nums := []int{-2, -3, 1, 4}

result := makeParityAlternating(nums)

fmt.Println(result)

}

Python完整代码如下:阿里PVC管道管件粘接胶

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

from typing import List

def make_parity_alternating(nums: List[int]) -> List[int]:

iflen(nums) == 1:

return [0, 0]

g_min = min(nums)

g_max = max(nums)

def calc(target: int) -> tuple:

op = 0

mn = float('inf')

mx = float('-inf')

for i, x in enumerate(nums):

# 如果 target = 0,那么操作后,nums 每个数的奇偶须分别等于 0,1,0,1,...

# 即 target ^ (i 2)

if (x - i) & 1 != target: # 等价于 x&1 != target ^ i2

op += 1

if x == g_min:

x += 1

elif x == g_max:

x -= 1

mn = min(mn, x)

mx = max(mx, x)

return op, max(mx - mn, 1)

op1, min_d1 = calc(0)

op2, min_d2 = calc(1)

if op1

return [op1, min_d1]

return [op2, min_d2]

if __name__ == "__main__":

nums = [-2, -3, 1, 4]

result = make_parity_alternating(nums)

print(result)

C++完整代码如下:

#include

#include

#include

#include

using namespace std;

vector makeParityAlternating(vector& nums) {

if (nums.size == 1) {

return {0, 0};

}

int gMin = *min_element(nums.begin, nums.end);

int gMax = *max_element(nums.begin, nums.end);

auto calc = [&](int target) -> pair {

int op = 0;

int mn = INT_MAX;

int mx = INT_MIN;

for (int i = 0; i

int x = nums[i];

// 如果 target = 0,那么操作后,nums 每个数的奇偶须分别等于 0,1,0,1,...

// 即 target ^ i2

if (((x - i) & 1) != target) { // 等价于 x&1 != target ^ i2

op++;

if (x == gMin) {

x++;

} elseif (x == gMax) {

x--;

}

}

mn = min(mn, x);

mx = max(mx, x);

}

// 在 n >= 2 的情况下,差至少是 1

return {op, max(mx - mn, 1)};

};

auto [op1, minD1] = calc(0);

auto [op2, minD2] = calc(1);

if (op1

return {op1, minD1};

}

return {op2, minD2};

}

int main {

vector nums = {-2, -3, 1, 4};

vector result = makeParityAlternating(nums);

cout

return0;

}

我们相信人工智能为普通人提供了种“增强工具”,并致力于分享全位的AI知识。在这里,您可以找到新的AI科普文章、工具评测、提升率的秘籍以及行业洞察。

欢迎关注“福大大架构师每日题”,发消息可获得面试资料,让AI助力您的未来发展。相关词条:玻璃棉毡     塑料挤出机     预应力钢绞线    铁皮保温    万能胶生产厂家

奥力斯    保温护角专用胶批发    联系人:王经理    手机:13903175735(微信同号)    地址:河北省任丘市北辛庄乡南代河工业区

1.本网站以及本平台支持关于《新广告法》实施的“极限词“用语属“违词”的规定阿里PVC管道管件粘接胶 ,并在网站的各个栏目、产品主图、详情页等描述中规避“违禁词”。
2.本店欢迎所有用户指出有“违禁词”“广告法”出现的地方,并积极配合修改。
3.凡用户访问本网页,均表示默认详情页的描述,不支持任何以极限化“违禁词”“广告法”为借口理由投诉违反《新广告法》,以此来变相勒索商家索要赔偿的违法恶意行为。

热点资讯

推荐资讯