题目名字:
Human readable duration format
原题链接:
https://www.codewars.com/kata/human-readable-duration-format/train/python
就是将一个秒钟化为人能看懂的时间,要注意细节,应该就是可以做出来的。
以前打C++的时候做了蛮多的,不过这题好像不支持C++。
但是我还是按照类似的思路做了一遍复杂度大概也就是一个O(n)
但是代码中有不少的重复段。所以有些长。
def format_duration(seconds):
if seconds == 0:
return 'now'
a = [0] * 5
b = ['second', 'minute', 'hour', 'day', 'year']
ans = ''
time = 0
for i, s in enumerate(a):
if i < 2:
a[i] = seconds % 60
seconds //= 60
if a[i] == 0:
continue
elif a[i] == 1:
if time == 0:
ans = '1 '+ b[i] + ans
elif time == 1:
ans = '1 '+ b[i] +' and '+ ans
else:
ans = '1 '+ b[i] +', '+ ans
time += 1
else:
if time == 0:
ans = str(a[i]) + ' ' + b[i] + 's' + ans
elif time == 1:
ans = str(a[i]) + ' ' + b[i] + 's' + ' and ' + ans
else:
ans = str(a[i]) + ' ' + b[i] + 's' + ', ' + ans
time += 1
elif i == 2:
a[i] = seconds % 24
seconds //= 24
if a[i] == 0:
continue
elif a[i] == 1:
if time == 0:
ans = '1 '+ b[i] + ans
elif time == 1:
ans = '1 '+ b[i] +' and '+ ans
else:
ans = '1 '+ b[i] +', '+ ans
time += 1
else:
if time == 0:
ans = str(a[i]) + ' ' + b[i] + 's' + ans
elif time == 1:
ans = str(a[i]) + ' ' + b[i] + 's' + ' and ' + ans
else:
ans = str(a[i]) + ' ' + b[i] + 's' + ', ' + ans
time += 1
elif i == 3:
a[i] = seconds % 365
seconds //= 365
if a[i] == 0:
continue
elif a[i] == 1:
if time == 0:
ans = '1 '+ b[i] + ans
elif time == 1:
ans = '1 '+ b[i] +' and '+ ans
else:
ans = '1 '+ b[i] +', '+ ans
time += 1
else:
if time == 0:
ans = str(a[i]) + ' ' + b[i] + 's' + ans
elif time == 1:
ans = str(a[i]) + ' ' + b[i] + 's' + ' and ' + ans
else:
ans = str(a[i]) + ' ' + b[i] + 's' + ', ' + ans
time += 1
else:
a[i] = seconds
if a[i] == 0:
continue
elif a[i] == 1:
if time == 0:
ans = '1 '+ b[i] + ans
elif time == 1:
ans = '1 '+ b[i] +' and '+ ans
else:
ans = '1 '+ b[i] +', '+ ans
time += 1
else:
if time == 0:
ans = str(a[i]) + ' ' + b[i] + 's' + ans
elif time == 1:
ans = str(a[i]) + ' ' + b[i] + 's' + ' and ' + ans
else:
ans = str(a[i]) + ' ' + b[i] + 's' + ', ' + ans
time += 1
return ans
打了没多就可以搞定很多都是重复字段。
!但是,要注意一个细节,在Python中,默认是可以做数的标准除法的,不像是之前的C++或者C。
/表示的取整
//(in Python) == / (in C/C++)
应该看懂上面这段话是没有问题的了。
按照套路,我们会分析一下,那些大佬的代码
times = [("year", 365 * 24 * 60 * 60),
("day", 24 * 60 * 60),
("hour", 60 * 60),
("minute", 60),
("second", 1)]
def format_duration(seconds):
if not seconds:
return "now"
chunks = []
for name, secs in times:
qty = seconds // secs
if qty:
if qty > 1:
name += "s"
chunks.append(str(qty) + " " + name)
seconds = seconds % secs
return ', '.join(chunks[:-1]) + ' and ' + chunks[-1] if len(chunks) > 1 else chunks[0]
在我那时,这个解法应该是最多认可的。
从循环的过程来看,这个是倒着来的。(所以,他都是直接取余数,而我之前那个版本是做整除)
在这个代码中,先是显示了一个由元组所组成的列表。可以看出,这家伙对于enumerate的理解应该是比较高的呢。
关于函数内部实现,第一段的那句返回,很显然
第二部分设置了一个空的列表,用于储存分段的数据
在一开始的时候所设置的列表,在这里起到了作用,可以直接提取出对应的分刻数据,用于计算。也正是这个原因,他的代码简洁度才得到了提高。
之后,由于name 是临时变量,所以,可以直接做+='s'处理,同样很方便。
之后就是正常的入库处理了。
在最后的返回的时候,做了一个判断处理。可以看出,只有当总数大于等于二的时候,才需要做+and处理,而大于2的部分,做加','处理,否则就直接返回第一个