Mô tả bài toán
Cho số nguyên n. Tìm số lớn nhất ≤ n sao cho các chữ số của nó không giảm (tức mỗi chữ số ≤ chữ số bên phải).
Ví dụ: n = 221 → đầu ra 199.
Giải thuật
- Chuyển
nthành mảng chữ sốdigits. - Khởi tạo
bound = None. - Duyệt từ phải sang trái (i từ
len(digits)-1xuống 1):- Nếu
digits[i] < digits[i-1]: đặtbound = i, giảmdigits[i-1]đi 1.
- Nếu
- Nếu
boundkhông phải None: đặt tất cả chữ số từboundđến cuối thành 9. - Ghép các chữ số thành số nguyên và trả về.
Ví dụ mã Python
class Solution:
def solve(self, n):
digits = [int(x) for x in str(n)]
bound = None
for i in range(len(digits) - 1, 0, -1):
if digits[i] < digits[i - 1]:
bound = i
digits[i - 1] -= 1
if bound is not None:
for i in range(bound, len(digits)):
digits[i] = 9
return int("".join(map(str, digits)))
ob = Solution()
n = 221
print(ob.solve(n))
Đầu vào
221
Đầu ra
199