申明:以下题目摘自Codewars
题目1:Given an integral number, determine if it's a square number。(7级)
def
程序思路:首先,平方数肯定是某个整数的平方,一定非负。其次,一个数是平方数,那么它的平方根也是整数,即存在一个整数,这个整数的平方等于需要判断的整数n。
for i in range(int(n**0.5)+1): 表示 i 从0到 int(n**0.5)+1迭代。而int(a)是将数a的小数部分直接丢掉取整。由于range(a,b)只会迭代到b-1,因此要+1。
更简单的写法如下:
from math import sqrt
def is_square(n):
return n > 0 and sqrt(n).is_integer()
巧妙的运用了布尔运算以及is_integer()和sqrt()函数
题目2:ATM machines allow 4 or 6 digit PIN codes and PIN codes cannot contain anything but exactly 4 digits or exactly 6 digits.If the function is passed a valid PIN string, return true, else return false.传入一个字符串,如果是4为或者6为数字,则返回正确,否则返回错误。(7级)
def validate_pin(pin):
return pin.isdigit() and (len(pin)==4 or len(pin)==6)
若将(len(pin)==4 or len(pin)==6)简化,可以写为:
def validate_pin(pin):
return len(pin) in (4, 6) and pin.isdigit()
利用正则表达式的写法如下:
import re
def validate_pin(pin):
return bool(re.match(r'^(d{4}|d{6})$',pin))
re.match()若没有匹配到,返回None,在bool()里解释为False。详见
ruinyou:Python小白的日常练习之Codewarszhuanlan.zhihu.com
题目3:You have to write the function findMissing(list), list will always be at least 3 numbers. The missing term will never be the first or last one.给出一列有规律的数字,例如:[1, 3, 5, 9, 11],找到缺失的数字,即7。题目中的规律均是线性关系。(6级)
def find_missing(sequence):
for i in range(len(sequence)):
interval = (sequence[-1]-sequence[0])/len(sequence)
a = sequence[i+1]-sequence[i]
if (a!=interval):
return int(sequence[i]+interval)
程序思路:首先 The missing term will never be the first or last one 根据计算出相邻数据的间隔,然后依次计算相邻数字之间的间隔,与计算出的间隔进行比较,最终找出缺失数字。
也可巧妙的采用等差数列求和公式找到缺失数字,如下:
def find_missing(sequence):
t = sequence
return (t[0] + t[-1]) * (len(t) + 1) / 2 - sum(t)
题目4:找到一组数据中的数字,这个数字左侧所有数字之和等于其右侧所有数字之和。例如:{1,2,3,4,3,2,1}这个数字是4,{1,100,50,-51,1,1}数字是100。若不存在这样的数字,则返回-1。(6级)
def find_even_index(arr):
for i in range(len(arr)):
left=sum(arr[:i]);right=sum(arr[i+1:])
if(left == right):
return i
return -1
程序思路:首先对列表进行切片,分别计算左右两边数字之和并比较,若相同则返回下标i。
题目5:Ore Numbers (also called Harmonic Divisor Numbers) are numbers for which the harmonic mean of all their divisors (including the number itself) equals an integer.判断一个数是否为谐波数,该数有这样的特性:其所有除数的个数(包括1和它本身)除以除数的倒数和为一个整数。例如:H(6) = 4 / (1/1 + 1/2 + 1/3 + 1/6) = 2。数字6就是一个谐波数。
def is_ore(n):###最好避免分数
divisors = [a for a in range(1,n+1) if(n % a==0)]
add = [b for b in divisors]
return True if ((n*len(divisors))%sum(add)==0) else False
由于计算机在计算分数时会存在精度问题,除了像上述代码这样进行化简避免分数运算,还可以使用fractions库,如下:
from fractions import Fraction
def is_ore(n):
divisors = set([1, n])
for d in range(2, int(n**0.5)+1):
if n % d == 0:
divisors.update(set([d, n/d]))
mean = Fraction(len(divisors), 1)/sum(Fraction(1, d) for d in divisors)
return mean.denominator == 1
mean是一个Fraction对象,访问它的denominator属性,即访问它的分母。若是整数,分母为1。numerator为分子属性。