[关闭]
@sevenup233 2018-04-01T13:05:13.000000Z 字数 1723 阅读 641

201803

CodeWar


20180329

题目:求公因数(不算1和自己),素数返回‘xx is prime’
初见:

  1. def divisors(integer):
  2. div = []
  3. for i in range(integer):
  4. a = i + 1
  5. if integer % a == 0:
  6. div.append(a)
  7. div.pop()
  8. div.pop(0)
  9. if div == []:
  10. return ('%s is prime'%(integer))
  11. else:
  12. return(div)

优化:

  1. def divisors(integer):
  2. return [a for a in range(2,integer) if integer % a == 0 ] or str('%s is prime'%(integer))

总结:%是除后余数,a % 2 == 0 常用判断a是偶数,‘%s’%()可在字符串引用变量

20180330

题目:取一段string的中位数
初见:

  1. def get_middle(s):
  2. r=int(len(s)/2-1)
  3. if len(s) % 2 == 0:
  4. l=s[r:r+2]
  5. else:
  6. l=s[r+1]
  7. return l

优化:

  1. def get_middle(s):
  2. return s[(len(s)-1)//2:len(s)//2+1]

总结:int是向下取整,/有一个浮点不能直接用来切片,//无浮点向下取整,round四舍五入,没有直接向下取整

20180331

题目:剔除 list a 中所有 list b 的元素
初见:

  1. def array_diff(a, b):
  2. c = []
  3. d = []
  4. # for j in a:
  5. # if not j in d:
  6. # for k in b:
  7. # if k == j:
  8. # d.append(k)
  9. for j in a:
  10. if j not in d:
  11. c.append(j)
  12. return(c)

优化:

  1. def array_diff(a, b):
  2. return [c for c in a if c not in b]

总结:想烦了,标注段完全没用,没必要设一个装垃圾的d,多考虑逆向思维

题目:123变成‘100+20+3’这样
初见:

  1. def expanded_form(num):
  2. a=str(num)
  3. n=len(a)
  4. d=str()
  5. for i in range(n):
  6. if a[i] != str(0):
  7. d += str(int(a[i])*10**(n-i-1)) + ' + '
  8. d = d[:-3]
  9. return(d)

优化:

  1. def expanded_form(num):
  2. return " + ".join([str(int(d) * 10**p) for p, d in enumerate(str(num)[::-1]) if d != "0"][::-1])

总结:
enumarate和两个逆序用的太妙了,还有join的中间插入可以省去一个末尾判断

  1. #关于enumuerate()
  2. a = ['a', 'b', 'c', 'd']
  3. b = list(enumerate(a)) #[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
  4. c = dict(enumerate(a)) #{0: 'a', 1: 'b', 2: 'c', 3: 'd'}
  5. d = list(enumerate(a,10)) #[(10, 'a'), (11, 'b'), (12, 'c'), (13, 'd')]
  6. for i,j in enumerate(a):
  7. print(i,a[i],j)
  8. #0 a a
  9. #1 b b
  10. #2 c c
  11. #3 d d

题目:确保括号都闭合
初见:

  1. def valid_parentheses(string):
  2. l = 0
  3. n = len(string)
  4. for i in range(n):
  5. if l == 0 and string[i] == ')':
  6. return False
  7. else:
  8. if string[i] == '(':
  9. l += 1
  10. if string[i] == ')':
  11. l -= 1
  12. if l == 0:
  13. return True
  14. else:
  15. return False

优化:

  1. def valid_parentheses(s):
  2. b = 0
  3. for c in s:
  4. if c == '(':
  5. b += 1
  6. if c == ')':
  7. b -= 1
  8. if b < 0:
  9. return False
  10. return b == 0

总结:首先可以直接for i in string,这样不用通过len和string[i]来取位;然后也不用进行开头是),在一次循环结束时用l<0验证就可以了;最后就是输出一个boolean自己判断就可以了,不用手动T/F

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注