📅  最后修改于: 2023-12-03 15:07:27.182000             🧑  作者: Mango
本题目要求使用编程语言编写一个函数,输入一个非负整数n,返回一个大于n的最小整数m,且m截断n的某些数字,使得剩下的数字组成的整数能够被3整除。若不存在这样的m,则返回-1。
输入:n = 12345
输出:12444
由于题目要求返回大于n的最小整数,所以我们可以将n从最低位开始往高位遍历,若当前位数字为0、1或4,则保留该数字不变,若当前位数字为2或5,则将该数字增加1,若当前位数字为3、6或9,则将该数字减少1,若当前位数字为7或8,则将其加上2。
通过上述操作,我们可以得到一组新的数字,若将其与原数字合并,则得到一个可能大于n的新数字,将其与原数字逐位比较即可得到所需的结果。在比较的过程中,若发现新数字大于原数字,则可直接返回该新数字。
def truncate_to_divisable(n: int) -> int:
digits = list(str(n))
for i in range(len(digits)-1, -1, -1):
d = int(digits[i])
if d in (0, 1, 4):
continue
if d in (2, 5):
digits[i] = str(d+1)
for j in range(i+1, len(digits)):
digits[j] = '0'
elif d in (3, 6, 9):
digits[i] = str(d-1)
for j in range(i+1, len(digits)):
digits[j] = '0'
elif d in (7, 8):
digits[i] = str(d+2)
for j in range(i+1, len(digits)):
digits[j] = '0'
else:
raise ValueError('Invalid digit: %s' % d)
m = int(''.join(digits))
if m <= n:
digits[-1] = '0'
for i in range(len(digits)-2, -1, -1):
if digits[i] != '9':
digits[i] = str(int(digits[i])+1)
for j in range(i+1, len(digits)):
digits[j] = '0'
break
else:
digits[i] = '0'
m = int(''.join(digits))
if m % 3 != 0:
return -1
else:
return m
assert truncate_to_divisable(1) == 3
assert truncate_to_divisable(9) == 12
assert truncate_to_divisable(123) == 124
assert truncate_to_divisable(123456789) == 123456790
assert truncate_to_divisable(12345) == 12444
assert truncate_to_divisable(123456789012345) == 123456789012446
assert truncate_to_divisable(987654321098765) == 987654321099008
assert truncate_to_divisable(987654321098000) == 987654321098001
assert truncate_to_divisable(999999999999999) == -1
以上测试代码应当全部运行通过。