在 Python 中使用相邻 k 次交换数字,查找可能的最小整数
假设我们有一个名为 num 的字符串,它代表一个非常大的整数,同时还有另一个名为 k 的值。我们最多可以交换任意两个相邻的数字 k 次。我们必须找到可以得到的最小值。
因此,如果输入是 num = “5432”,k = 4,则输出将是 2453,因为一开始数字是 5432。然后在第一轮后,它将变为 4532,然后是 4523,然后是 4253,最终是 2453。
为了解决这个问题,我们将按照以下步骤进行:
- min_num:对 num 的数字进行排序
-
i:从 0 开始,to_find:0
-
当 num 不同于 min_num 且 k > 0 且 i < num 的大小时,执行以下操作
- indx:在 num 中从索引 i 开始查找要找的项
-
当 indx 不等于 -1 时,执行以下操作
- 如果 indx – i <= k,则
-
num:从索引 0 到 i-1 的 num 连接 num[indx] 连接 num 从索引 i 到 indx-1 的数量,连接 num 从索引 indx+1 到结尾
-
k:k – (indx – i)
-
i:i + 1
-
to_find:0
-
indx:在 num 中从索引 i 开始查找要找的项
-
否则,
-
退出循环
- 如果 indx – i <= k,则
-
to_find:to_find + 1
-
返回 num
示例
让我们看下面的实现,以便更好地理解
def solve(num, k):
min_num = sorted(list(num))
min_num = ''.join(min_num)
i = 0
to_find = 0
while num != min_num and k > 0 and i < len(num):
indx = num.find(str(to_find), i)
while indx != -1:
if indx - i <= k:
num = num[:i] + num[indx] + num[i:indx] + num[indx+1:]
k -= (indx - i)
i += 1
to_find = 0
indx = num.find(str(to_find), i)
else:
break
to_find += 1
return num
num = "5432"
k = 4
print(solve(num, k))
输入
"5432", 4
输出
2453