[简单题]换一个思维,代码简洁度就完全变了(Python实现)

题目名字:

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

主要是那个判断加's' 、','、' '、'and' 

打了没多就可以搞定很多都是重复字段。

!但是,要注意一个细节,在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的部分,做加','处理,否则就直接返回第一个



你可能感兴趣的:(Python,简单题,python,博客,string,name)