python sequence_Python小白的日常练习之数字判断与处理

c4795487ca790f510ef9169fc8132b22.png

申明:以下题目摘自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小白的日常练习之Codewars​zhuanlan.zhihu.com
90c90daddd166287662e94424fc6e867.png

题目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为分子属性。


我是Python小白,欢迎讨论交流!觉得有帮助请点赞支持哦!

2018/5/14

参考资料:

在Python中处理分数 - Python - 伯乐在线​python.jobbole.com
6bc5cb155282e1fc20e41832739baab0.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值