#python
题目分析与解题思路
题目要求我们找出将一个整数通过最少次的数字交换(可以交换任意两位,交换后可含前导零)变成 4 的倍数的方法。如果不可能,则返回 - 1。
解题的关键在于数学知识:一个数是 4 的倍数,当且仅当它的最后两位组成的数是 4 的倍数。这是因为 100 是 4 的倍数,所以任何数的前几位乘以 100 后都是 4 的倍数,只需最后两位能被 4 整除即可。
基于这个原理,我们可以设计如下解题思路:
将数字转换为字符串以便处理
检查是否存在两位数字(可以是相同位置)组成的数能被 4 整除
计算使这两位成为最后两位需要的最少交换次数
具体实现步骤
如果数字只有 1 位:
直接检查该数字是否能被 4 整除
能则不需要交换(0 次),否则不可能(-1)
如果数字有多位:
检查所有可能的两位组合(i,j),判断组成的数是否能被 4 整除
对于有效的组合,计算需要的交换次数:
如果 j 是最后一位:只需将 i 交换到倒数第二位(1 次,除非 i 已经在倒数第二位)
否则:需要将 j 交换到最后一位,再将 i 交换到倒数第二位(2 次,除非 i 或 j 已经在目标位置)
取所有有效组合的最少交换次数
#可是,TLE了......
主要优化点说明
减少循环次数:将 j 的循环从 0 到 n-1 改为从 i+1 到 n-1,减少了近一半的迭代次数,同时通过检查两种组合 (i,j) 和 (j,i) 保持了功能完整性。
预计算数字值:提前将字符转换为整数并存储在列表中,避免在循环中重复进行类型转换。
更高效的交换次数计算:简化了交换次数的计算逻辑,减少了条件判断的复杂度。
提前终止可能:对于找到 0 次交换的情况(原数已经是 4 的倍数),可以立即返回结果,但代码中通过 min 函数自然处理了这种情况。
这些优化显著减少了算法的常数因子,对于处理大规模输入(如非常长的数字字符串)时,能有效避免超时问题。算法的时间复杂度仍然是 O (n²),但实际运行速度会快很多。