Cho một số nguyên không âm N, tìm số lớn nhất nhỏ hơn hoặc bằng N sao cho các chữ số của nó tăng dần đơn điệu (mỗi cặp chữ số liền kề x, y thỏa mãn x <= y).
Ví dụ: N = 332 → kết quả 299.
Thuật toán
- Chuyển
Nthành chuỗis, đặti = 1,n = s.length(). - Tăng
icho đến khis[i] < s[i-1]hoặc hết chuỗi. - Nếu
i < n:- Lùi
ivề trước và giảms[i]đi 1 cho đến khis[i-1] <= s[i].
- Lùi
- Đặt tất cả ký tự từ
i+1đến cuối thành'9'. - Chuyển chuỗi kết quả về số nguyên.
Mã nguồn C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int monotoneIncreasingDigits(int N) {
string s = to_string(N);
int i = 1, n = s.size();
while (i < n && s[i] >= s[i-1]) i++;
if (i < n) {
while (i > 0 && s[i-1] > s[i]) {
i--;
s[i]--;
}
}
for (int j = i+1; j < n; j++) s[j] = '9';
return stoi(s);
}
};
int main() {
Solution ob;
cout << ob.monotoneIncreasingDigits(332);
return 0;
}
Đầu vào / Đầu ra
Input: 332
Output: 299