cuốn sách gpt4 ai đã làm

738. Các chữ số tăng đều đều Các số tăng đều đều

In lại Tác giả: Đường đến ông chủ Thời gian cập nhật: 2024-01-31 14:17:15 25 4
mua khóa gpt4 Nike

Địa chỉ câu hỏi: https://leetcode.com/problems/monotone-increasing-digits/description/

Mô tả chủ đề:

Cho số nguyên N không âm, tìm số lớn nhất nhỏ hơn hoặc bằng N có các chữ số tăng dần đơn điệu.

(Hãy nhớ rằng một số nguyên có các chữ số tăng dần đơn điệu khi và chỉ khi mỗi cặp chữ số liền kề x và y thỏa mãn x <= y.)

Ví dụ 1:

Đầu vào: N = 10 Đầu ra: 9

Ví dụ 2:

Đầu vào: N = 1234 Đầu ra: 1234

Ví dụ 3:

Đầu vào: N = 332 Đầu ra: 299

Lưu ý: N là số nguyên trong khoảng [0, 10^9].

Ý tưởng chung của chủ đề

Tìm số lớn nhất nhỏ hơn số này trong đó mỗi chữ số đều tăng dần.

Phương pháp giải quyết vấn đề

Chia các số cho trong câu hỏi thành mảng cho dễ hiểu. Nếu hiểu được điều này thì chúng ta cần tìm mảng tăng lớn nhất.

Cách thực hiện là tìm vị trí giảm dần đầu tiên. Có hai tình huống:

Trường hợp 1: Với 14267, vị trí giảm dần đầu tiên là 4 nên đổi 4 thành 3 và đổi tất cả các số sau 4 thành 9. Ta được 13999;

Trường hợp 2: Đối với 1444267 thì vị trí giảm dần đầu tiên là 4 cuối cùng. Nếu chỉ xử lý 4 số cuối theo trường hợp 1 thì kết quả là 1443999, vẫn chưa đúng nghĩa câu hỏi. Vì vậy, bạn cần tìm số 4 ở vị trí đầu tiên, sau đó thực hiện thao tác case1, để có được 1399999.

Khi tôi viết mã, tôi đã làm theo thứ tự ngược lại, sau đó tôi đã mắc lỗi và viết num[i] > num[i - 1] hoặc (ind != -1 và num[i] == num[i - 1]). Tại sao nó không thể là num[i] == num[i - 1]? Vì làm như vậy sẽ tìm được vị trí bằng nhau cuối cùng, còn ta chỉ cần tìm vị trí bằng nhau đầu tiên mà thôi.

Độ phức tạp về thời gian là O(n) và độ phức tạp về không gian là O(n).

Mã này như sau:

class Giải pháp: def monotoneIncreasingDigits(self, N): """ :type N: int :rtype: int """ if N < 10: return N num = [int(n) for n in str(N)[:: -1]] n = len(num) ind = -1 for i in range(1, n): if num[i] > num[i - 1] hoặc (ind != -1 và num[i] == num[ind]): ind = i if ind == -1: return N res = '9' * ind + str(num[ind] - 1) + "".join(map(str , num[ind + 1:])) return int(res[::-1])

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

Nếu bạn không sử dụng thứ tự ngược lại, bạn cũng có thể làm:

class Giải pháp: def monotoneIncreasingDigits(self, N): """ :type N: int :rtype: int """ if N < 10: return N num = [int(n) for n in str(N)] n = len(num) ind = n - 1 for i in range(n - 2, -1, -1): if num[i] > num[i + 1] hoặc (ind != n - 1 và num[i] == num[ind]): ind = i if ind == n - 1: return N num[ind] -= 1 for i in range(ind + 1, n): num[i] = 9 trả về int("".join(map(str, num)))

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

Tài liệu tham khảo:

https://leetcode.com/problems/monotone-increasing-digits/discuss/109794/Simple-Python-solution-w-Explanation

DDKK.COM Brother Kuaikan-hướng dẫn, trang thông tin lập trình dành cho lập trình viên, bản quyền thuộc về tác giả gốc

Bài viết này được viết bởi:nến tuyết tiêu cực Được ủy quyền xuất bản, không tổ chức, cá nhân nào được chuyển tiếp nếu không có sự cho phép của tác giả

25 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress