霍格沃兹魔法学院流传着一个关于数字3的游戏,规则是输入一个数字n
,如果n能被3整除则直接返回n
。如果不能,那么尝试每次剔除掉一个末尾数字并检查剩下的数字能否被3整除,如果可以就返回剩下的数字,否则返回None
。请编写一个python3函数来实现它吧。
示例:
输入:36
,输出:36
输入:1
,输出:None
输入:952406
,输出:9
题目难度:简单
题目来源:codewars
def prev_mult_of_three(n: int):
pass
assert prev_mult_of_three(36) == 36
assert prev_mult_of_three(1) == None
assert prev_mult_of_three(1244) == 12
assert prev_mult_of_three(952406) == 9
hua123
(测开19期学委-花小田)
2021 年8 月 30 日 02:57
2
def prev_mult_of_three(n: int):
return None if len(str(n)) == 1 and n % 3 else n if n % 3 == 0 else prev_mult_of_three(int(str(n)[:-1]))
assert prev_mult_of_three(36) == 36
assert prev_mult_of_three(1) == None
assert prev_mult_of_three(1244) == 12
assert prev_mult_of_three(952406) == 9
def prev_mult_of_three(n):
if n % 3 == 0:
return n
s = str(n)[::-1]
for i in range(1,len(s)):
if int(s[i:]) % 3 == 0:
return int(s[i:][::-1])
思路:倒着找可能有点费劲,所以考虑先将数字颠倒过来,如果能找到符合条件的则逆序返回即可;如果倒着找不到那顺着也一定找不到,直接返回None。
def prev_mult_of_three(n: int):
if n%3==0:
return n
else:
s=str(n)
s=s[::-1]
for i in range(0,len(s)):
if int(s[i:])%3==0:
return int(s[i:][::-1])
佛爷提供思路,学到了
public Integer prevMultOfThree(Integer integer) {
// 霍格沃兹魔法学院流传着一个关于数字3的游戏,规则是输入一个数字n ,如果n能被3整除则直接返回n 。如果不能,那么尝试每次剔除掉一个末尾数字并检查剩下的数字能否被3整除,如果可以就返回剩下的数字,否则返回None 。请编写一个python3函数来实现它吧。
// 示例:
// 输入:36 ,输出:36
// 输入:1 ,输出:0
// 输入:952406 ,输出:9
return integer % 3 == 0 ? integer : prevMultOfThree(integer / 10);
}
@Test
public void prevMultOfThreeTest() {
assert prevMultOfThree(36) == 36;
assert prevMultOfThree(1244) == 12;
assert prevMultOfThree(952406) == 9;
assert prevMultOfThree(1) == 0;
}
def prev_mult_of_three(n: int):
# 先把一位数且不能整除3的return None
if len(str(n)) == 1 and n % 3 != 0:
return None
# 原数能被3整除,return n
if n % 3 == 0:
return n
# 原数不能被3整除,删掉最后一位,再次判断,直到能被整除或不能整除
for i in range(len(str(n))):
n = str(n)[:-1]
# 加这个判断的作用防止删掉剩最后一位,且不能被整除,会报ValueError错
if len(n) == 1 and int(n) % 3 != 0:
return None
elif int(n) % 3 == 0:
return int(n)
assert prev_mult_of_three(36) == 36
assert prev_mult_of_three(1244) == 12
assert prev_mult_of_three(952406) == 9
assert prev_mult_of_three(9524061) == 9524061
assert prev_mult_of_three(1) == None
assert prev_mult_of_three(10) == None
assert prev_mult_of_three(100) == None
assert prev_mult_of_three(112) == None
assert prev_mult_of_three(1000) == None
assert prev_mult_of_three(10000) == None
assert prev_mult_of_three(1000000) == None
小佛,写的太复杂了,看看我这个怎么优化
@1286175038_5382 Emmm如果是按照从后往前的话,你这样做已经比较精简了,我想不出更好的办法。我当时选择先逆序再求和就是为了偷懒