Đề bài
Đếm các số nguyên từ left đến right, bao gồm cả hai đầu mút, mà không có hai chữ số liền kề nào giống nhau. Sử dụng cách viết thập phân thông thường, không có số 0 ở đầu. Số 0 và tất cả các số một chữ số khác đều thỏa mãn điều kiện này.
Cài đặt hàm counting_numbers(left, right).
Đầu vào
left: Giá trị nhỏ nhất được phép.
right: Giá trị lớn nhất được phép.
Đầu ra
Trả về số lượng giá trị thỏa mãn điều kiện trên.
Ràng buộc
0 ≤ left ≤ right ≤ 10¹⁸. Đoạn giá trị có thể quá lớn để kiểm tra từng số một cách tuần tự.
Ví dụ
Đầu vào:
left = 10
right = 15
Kết quả mong đợi:
expected = 5
Đầu vào:
long long left = 10;
long long right = 15;
Kết quả mong đợi:
long long expected = 5;
Đầu vào:
long left = 10;
long right = 15;
Kết quả mong đợi:
long expected = 5;
Giải thích
Chỉ có số 11 là có hai chữ số liền kề giống nhau. Năm số còn lại đều thỏa mãn điều kiện.
Đầu vào:
left = 0
right = 9
Kết quả mong đợi:
expected = 10
Đầu vào:
long long left = 0;
long long right = 9;
Kết quả mong đợi:
long long expected = 10;
Đầu vào:
long left = 0;
long right = 9;
Kết quả mong đợi:
long expected = 10;
Giải thích
Cả mười giá trị đều là số một chữ số nên không có hai chữ số liền kề giống nhau.
Hướng tiếp cận
Hãy tự thử trước, sau đó mở từng gợi ý một.
Gợi ý 1
Đếm các số hợp lệ đến từng đầu mút rồi trừ để lấy kết quả trên đoạn.
Gợi ý 2
Digit DP rất hợp vì tính hợp lệ phụ thuộc vào các chữ số kề nhau và việc đã bắt đầu số hay chưa.
Gợi ý 3
Số 0 ở đầu cần xử lý riêng để các số ngắn hơn được đếm đúng.
Độ phức tạp mong đợi
thời gian O(k * 10 * states), bộ nhớ phụ O(k * states)
Tham khảo
Thử thách này đã được điều chỉnh cho CodeUtility. Hãy làm theo đề bài và các ràng buộc ở trên.