Mô tả bài toán
Cho số nguyên N, thay thế tất cả chữ số 0 bằng 5. Tuy nhiên, các số 0 ở đầu (leading zeros) bị bỏ qua.
Ví dụ:
1007→1557(2 số 0 giữa thay thành 5)00105→155(số 0 đầu bị bỏ, số 0 giữa thành 5, kết quả parse thành int)
Giải pháp: Xử lý chuỗi (đơn giản, khuyên dùng)
def replace_zeros(n):
"""Thay 0 thành 5, bỏ leading zeros."""
# Chuyển thành string, strip leading zeros
s = str(n).lstrip('0')
# Nếu toàn số 0 -> thành empty string, xử lý đặc biệt
if not s:
return 0
# Thay 0 -> 5
s = s.replace('0', '5')
return int(s)
# Test
test_cases = [1007, 00105, 14006, 0, 5000, 12345]
for n in test_cases:
print(f"{n} -> {replace_zeros(n)}")
Đầu ra
1007 -> 1557 105 -> 155 14006 -> 14556 0 -> 0 5000 -> 5555 12345 -> 12345
Lưu ý: Trong Python, literal 00105 là syntax error (Python 3). Input thực tế sẽ là string "00105" hoặc int 105.
Giải pháp 2: Xử lý toán học (đệ quy - cách gốc)
def convertToFive(number):
if number == 0:
return 0
return calculateAddedValue(number) + number
def calculateAddedValue(number):
result = 0
placeValue = 1
if number == 0:
result += 5 * placeValue
while number > 0:
if number % 10 == 0:
result += 5 * placeValue
number //= 10
placeValue *= 10
return result
print(convertToFive(14006)) # 14556
So sánh
| Phương pháp | Độ phức tạp | Dễ hiểu | Xử lý leading zeros |
|---|---|---|---|
| String replace | O(d) - d: số chữ số | Rất dễ | Tự nhiên (lstrip) |
| Toán học/Đệ quy | O(d) | Khó hơn | Cần logic riêng |
Khuyên dùng: Cách string xử lý đơn giản, ít bug, dễ maintain.