@sevenup233
2018-04-01T13:05:13.000000Z
字数 1723
阅读 673
CodeWar
题目:求公因数(不算1和自己),素数返回‘xx is prime’
初见:
def divisors(integer):div = []for i in range(integer):a = i + 1if integer % a == 0:div.append(a)div.pop()div.pop(0)if div == []:return ('%s is prime'%(integer))else:return(div)
优化:
def divisors(integer):return [a for a in range(2,integer) if integer % a == 0 ] or str('%s is prime'%(integer))
总结:%是除后余数,a % 2 == 0 常用判断a是偶数,‘%s’%()可在字符串引用变量
题目:取一段string的中位数
初见:
def get_middle(s):r=int(len(s)/2-1)if len(s) % 2 == 0:l=s[r:r+2]else:l=s[r+1]return l
优化:
def get_middle(s):return s[(len(s)-1)//2:len(s)//2+1]
总结:int是向下取整,/有一个浮点不能直接用来切片,//无浮点向下取整,round四舍五入,没有直接向下取整
题目:剔除 list a 中所有 list b 的元素
初见:
def array_diff(a, b):c = []d = []# for j in a:# if not j in d:# for k in b:# if k == j:# d.append(k)for j in a:if j not in d:c.append(j)return(c)
优化:
def array_diff(a, b):return [c for c in a if c not in b]
总结:想烦了,标注段完全没用,没必要设一个装垃圾的d,多考虑逆向思维
题目:123变成‘100+20+3’这样
初见:
def expanded_form(num):a=str(num)n=len(a)d=str()for i in range(n):if a[i] != str(0):d += str(int(a[i])*10**(n-i-1)) + ' + 'd = d[:-3]return(d)
优化:
def expanded_form(num):return " + ".join([str(int(d) * 10**p) for p, d in enumerate(str(num)[::-1]) if d != "0"][::-1])
总结:
enumarate和两个逆序用的太妙了,还有join的中间插入可以省去一个末尾判断
#关于enumuerate()a = ['a', 'b', 'c', 'd']b = list(enumerate(a)) #[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]c = dict(enumerate(a)) #{0: 'a', 1: 'b', 2: 'c', 3: 'd'}d = list(enumerate(a,10)) #[(10, 'a'), (11, 'b'), (12, 'c'), (13, 'd')]for i,j in enumerate(a):print(i,a[i],j)#0 a a#1 b b#2 c c#3 d d
题目:确保括号都闭合
初见:
def valid_parentheses(string):l = 0n = len(string)for i in range(n):if l == 0 and string[i] == ')':return Falseelse:if string[i] == '(':l += 1if string[i] == ')':l -= 1if l == 0:return Trueelse:return False
优化:
def valid_parentheses(s):b = 0for c in s:if c == '(':b += 1if c == ')':b -= 1if b < 0:return Falsereturn b == 0
总结:首先可以直接for i in string,这样不用通过len和string[i]来取位;然后也不用进行开头是),在一次循环结束时用l<0验证就可以了;最后就是输出一个boolean自己判断就可以了,不用手动T/F