Cho chuỗi num biểu diễn một số nguyên rất lớn và giá trị k. Ta có thể hoán đổi hai chữ số kề nhau tối đa k lần. Yêu cầu tìm giá trị nhỏ nhất có thể đạt được.
Ví dụ: num = "5432", k = 4 → kết quả 2453 (5432 → 4532 → 4523 → 4253 → 2453).
Giải thuật
min_num:= sắp xếp các chữ số củanumtheo thứ tự tăng dần.- Khởi tạo
i := 0,to_find := 0. - Trong khi
num != min_numvàk > 0vài < len(num):- Tìm chỉ số
indxcủa chữ sốto_findtrongnumtừ vị tríi. - Trong khi
indx != -1:- Nếu
indx - i <= k:- Di chuyển chữ số tại
indxvề vị tríi(dịch các phần tử giữa). - Cập nhật
k := k - (indx - i),i := i + 1,to_find := 0. - Tiếp tục tìm
to_findtừ vị tríimới.
- Di chuyển chữ số tại
- Ngược lại: thoát vòng lặp trong.
- Nếu
to_find := to_find + 1.
- Tìm chỉ số
- Trả về
num.
Ví dụ minh họa
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))
Đầu vào
"5432", 4
Đầu ra
2453