求使数组元素奇偶交替的最少操作次数的最优解法
问题分析与优质解法思路
问题核心
通过对数组元素执行任意次floor(item/2)操作,让数组呈现奇偶交替状态(两种可能:奇→偶→奇… 或 偶→奇→偶…),统计所需的最少总操作次数。
关键认知
每个元素的奇偶性可以通过多次除以2取整切换,但切换到目标奇偶性的操作次数不同:
- 偶数转奇数:需要不断除以2,直到得到奇数,操作次数是除以2的次数(比如
6→3要1次,8→1要3次); - 奇数转偶数:只需除以2一次(比如
5→2要1次); - 本身符合目标奇偶性的,操作次数为0。
优质解法步骤
提前算好每个元素的转换成本
对数组里的每个元素,分别算出:- 转成奇数需要的最少操作次数;
- 转成偶数需要的最少操作次数。
示例代码片段(Python):
def get_conversion_cost(x): # 计算转成奇数的最少操作次数 cost_odd = 0 temp = x while temp % 2 == 0 and temp != 0: temp = temp // 2 cost_odd += 1 # 计算转成偶数的最少操作次数 cost_even = 0 if x % 2 == 1: cost_even = 1 return cost_odd, cost_even计算两种交替模式的总操作次数
奇偶交替只有两种合法模式,分别计算总代价:- 模式1:奇数开头(索引偶数位要奇,奇数位要偶):
遍历数组,索引为偶数时累加该元素转奇的成本,奇数时累加转偶的成本。 - 模式2:偶数开头(索引偶数位要偶,奇数位要奇):
遍历数组,索引为偶数时累加该元素转偶的成本,奇数时累加转奇的成本。
- 模式1:奇数开头(索引偶数位要奇,奇数位要偶):
取最小值作为最终答案
对比两种模式的总操作次数,更小的那个就是最少需要的操作次数。
对测试用例的修正计算
测试用例items = [6, 5, 9, 7, 3]:
- 各元素转换成本:
- 6:转奇1次,转偶0次
- 5:转奇0次,转偶1次
- 9:转奇0次,转偶1次
- 7:转奇0次,转偶1次
- 3:转奇0次,转偶1次
- 模式1总代价:1+1+0+1+0=3
- 模式2总代价:0+0+1+0+1=2
- 正确答案应为2,而非你代码得到的3——你的代码错误地将每个需要改变奇偶性的元素算作1次操作,既没考虑元素转换可能需要多次操作的情况,也没算出真正的最小总操作次数。
内容的提问来源于stack exchange,提问作者Akshit
相关产品推荐
相关产品推荐

