题目:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
num = [a*100 + b*10 + c for a in range(1, 5) for b in range(1, 5) for c in range(1,5) if ( a != b ) and (a != c) and (b != c)]
for i in num:
print(i)
题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
p = float(input('当月利润(万元): '))
b = float(0)
ivs = [10, 10, 20, 20, 40]
rates = [0.1, 0.075, 0.05, 0.03, 0.015, 0.01]
for i in range(len(ivs)):
if p <= ivs[i]:
b += p * rates[i]
break
else:
b += ivs[i] * rates[i]
p -= ivs[i]
else:
b += p * rates[-1]
print('{:.2f}'.format(b))
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
l = [a for a in range(-10000,10000) for b in range(100) for c in range(100) if a+100 == b*b and a+268 == c*c]
for i in l:
print(i)
题目:输入某年某月某日,判断这一天是这一年的第几天?
def is_leap(year):
return (year%400==0 or (year%4==0 and year%100!=0))
md = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
res = 0
y,m,d = map(int, input('输入年 月 日: ').split())
if is_leap(y):
md[1] += 1
for i in range(m-1):
res += md[i]
print(res+d)
题目:斐波那契数列。
def fib(n):
a,b= 0,1
for _ in range(1, n):
a,b = b, a + b
return b
题目:输出 9*9 乘法口诀表。
for x in range(1, 10):
print()
for y in range(1, x+1):
print ('%s x %s = %s' % (y, x, y*x), end=' ')
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
分析:出生后第3个月就开始生,说明兔子两个月成熟。也是一个斐波那契数列,n为月数,sum为兔子对数。
def fib(n):
a,sum= 1,1
for _ in range(n-2):
a,sum = sum, a + sum
return sum
题目:判断101-200之间有多少个素数,并输出所有素数。
from collections.abc import Iterable
class PrimeNumbers(Iterable):
def __init__(self, a, b):
self.a = a
self.b = b
def __iter__(self):
for k in range(self.a, self.b + 1):
if self.is_prime(k):
yield k
def is_prime(self, k):
return False if k < 2 else all(map(lambda x: k % x, range(2, k)))
pn = PrimeNumbers(101, 201)
for n in pn:
print(n, end= ' ')
题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
l = [a*100 + b*10 + c for a in range(1,10) for b in range(10) for c in range(10) if a*100 + b*10 + c == a**3 + b**3 + c**3]
for i in l:
print(i, end=' ')
题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
。
import math
number = int(input("输入一个不小于1的正整数: "))
l = []
def prime_factors(n):
square = int(math.sqrt(n)) + 1
is_prime = True
i = 2
while i <= square:
if n % i == 0:
l.append(i)
is_prime = False
prime_factors(n // i)
break
i += 1
if is_prime and n >= 2:
l.append(n)
prime_factors(number)
for i in l:
print(i, end=' ')
题目:求s=a+aa+aaa+aaaa+aa...a
的值,其中a是一个数字。例如2+22+222+2222+22222
,此时共有5个数相加。
分析:可用递归实现,n为数字,d为最大位数。
def my_sum(n,d):
s = 0
def num(d):
if d == 1:
m = n
else:
m = n*(10**(d-1)) + num(d-1)
return m
for i in range(1, d+1):
s += num(i)
return s
print(my_sum(2,5))
题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3。编程找出1000以内的所有完数。
def factors(n):
l = [i for i in range(1, n) if n % i == 0]
return l
num = [i for i in range(2, 1001) if i == sum(factors(i))]
for x in num:
print(x, end=' ')
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
def reb(h, n):
r = h*(0.5**(n))
return r
def hgt(h, n):
s = 100
for i in range(1, n):
s += reb(h,i) * 2
return s
print(hgt(100, 10))
print(reb(100, 10))
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
def peach(d):
if d == 10:
n = 1
else:
n = (peach(d+1)+1)*2
return n
pick = peach(1) - peach(2)
print(pick)
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x、z比,请编程序找出三队赛手的名单。
分析:集合中元素不会重复。
a,b,c = set('xyz'),set('xyz'),set('xyz')
a -= set('x')
c -= set('xz')
i = {'a':i for i in a for j in b for k in c if len(set([i,j,k]))==3}
j = {'b':j for i in a for j in b for k in c if len(set([i,j,k]))==3}
k = {'c':k for i in a for j in b for k in c if len(set([i,j,k]))==3}
print(i, j, k, end=' ')
题目:使用*打印出如下菱形图案:
*
***
*****
*******
*****
***
*
分析:总行数为2n-1
,总列数为2x-1
,即菱形最长为2x-1
。
def diamonds(n, x):
a = "*" * (2*(x-n)+1)
print(a.center(2*x-1,' '))
if n != 1:
diamonds(n-1,x)
print(a.center(2*x-1,' '))
diamonds(4, 4)
题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。
a,b,s = 1.0, 2.0, 0
for i in range(1, 21):
s += b/a
a,b = b,a+b
print(s)
题目:求1+2!+3!+…+20!的和。
def sum_factorial(n):
m,s = 1,0
for n in range(1,n+1):
m *= n
s += m
print(s)
sum_factorial(20)
题目:利用递归方法求5!
。
def factorial(n):
m = 0
if n == 1:
m += n
else:
m += n * factorial(n-1)
return m
# print(factorial(6))
题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
def palindrome(s):
res = 'yes' if s == s[::-1] else 'no'
print(res)
s = str(abs(int(input('输入一个大于2位的整数: '))))
palindrome(s)
题目:找出列表的中只出现一次的元素。
from collections import Counter
l = ['a', 1, 2, 2, 'c', 'b', 'c', 'a']
k = {k for k in Counter(l).keys() if Counter(l)[k] == 1}
print(k)
题目:找出列表中出现次数最多的元素。
from collections import Counter
l = ['a', 1, 2, 2, 'c', 'b', 'c', 'a', 'b', 2]
k = {k for k,v in Counter(l).items() if [(k,v)] == Counter(l).most_common(1)}
print(k)
题目:给定正整数m,判断它是否是另一个数的平方,是则返回该数+1后的平方,否则返回-1。
def next_power(m):
n = 1
while n <= m:
if n**2 == m:
return (n+1)**2
n += 1
return -1
题目:编写一个函数,当给定一个 URL 作为字符串时,只解析该域名并将其作为字符串返回。 例如:
domain_name("http://github.com/carbonfive/raygun") == "github"
domain_name("http://www.zombie-bites.com") == "zombie-bites"
domain_name("https://www.cnet.com") == "cnet"
def domain_name(url):
return re.search(r'(https?://)?(www\d?.)?(?P[\w-]+).' , url).group('name')
题目:求一个3*3矩阵主对角线元素之和。
from random import randint
l1,l2,s = [randint(-100, 100) for _ in range(3)], [], 0
for i in range(len(l1)):
l2.append(l1)
s += l2[i][i]
print(s)
题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
from random import randint
l,a = sorted([randint(-100, 100) for _ in range(10)]), randint(-100, 100)
l.insert(0,a)
print(sorted(l))
题目:将一个数组逆序输出。
from random import randint
l = [randint(-100, 100) for _ in range(10)]
for i in sorted(l, reverse=True): #按大小顺序反向输出
# for i in reversed(l): #根据列表原排序倒着输出
print(i, end=' ')
题目:Atm 机允许4位或6位的 PIN 码,PIN 码只能包含4位或6位数字。如果向函数传递了有效的 PIN 字符串,则返回True,否则返回False。
方法1:
def validate_pin(pin):
if len(pin) == 4 or len(pin) == 6:
if pin.isdigit():
return True
return False
方法2:
def validate_pin(pin):
return len(pin) in (4, 6) and pin.isdigit()
题目:给定数字n,取组成n的数字的和。如果该值仍由多个数字组成,则继续以这种方式递减,直到有一个个位数产生为止。
方法1:
from functools import reduce
def digital_root(n):
s = reduce(lambda a,b:a+b, [int(i) for i in str(n)])
if len(str(s)) == 1:
return s
return digital_root(s)
方法2:
def digital_root(n):
return n if n < 10 else digital_root(sum(map(int,str(n))))
题目:给定一个包含整数的数组(长度至少为3)。数组要么全由奇数组成,奇数组成的数组只能有一个偶数;要么全由偶数组成,偶数组成的数组只能有一个奇数。找出奇数数组中的唯一偶数或偶数数组中的唯一奇数。
def find_outlier(integers):
l1,l2 = [k for k in integers if k % 2 == 1], [k for k in integers if k % 2 == 0]
return l2[0] if len(l1) > len(l2) else l1[0]
题目 计算两个矩阵相加。对应位置依次相加,并放到结果矩阵的对应位置。
from random import randint
l1 = [[randint(-100, 100) for _ in range(3)]] * 3
l2 = [[randint(-100, 100) for _ in range(3)]] * 3
s = [l1[i][j] + l2[i][j] for i in range(len(l1)) for j in range(len(l1[0]))]
res = [s[:3], s[3:6], s[6:]]
print(res)
题目:判断一个整数是否是另一个整数的立方和。给定立方和m,求整数x,不存在则返回-1。
def find_nb(m):
n,s = 1,0
while s < m:
s += n**3
if s == m:
return n
n += 1
return -1
# print(find_nb(4183059834009))
题目:对于一个长度至少为2的数组,给定整数m,判断m是否为数组中两个不同元素的和。如果是,返回元素索引值组成的元组,否则返回-1。
def two_sum(numbers, target):
d = {i:j for i in range(len(numbers)) for j in range(len(numbers)) if numbers[i] + numbers[j] == target and i != j}
for k in d.keys():
t = (k,d[k])
return t
return -1
题目:在数学中,完全幂是一个正整数,可以用另一个正整数的整数幂来表示。
编写一个函数,判断一个数n
是否是完全幂,当a^b = n
时则返回任意一对(a, b)
,否则返回None。对于b = 1
的情况,只有在n = 1
时才允许成立。
def isPP(n):
a,b = 2,2
if n == 1:
return [1,1]
while a >= 2:
a = round(n ** (1/b))
if a ** b == n:
return [a, b]
b += 1
# print(isPP(16))
题目:给定一个数组,该数组只有一个整数出现奇数次,找出出现奇数次的整数。
方法1:
from collections import Counter
def find_it(seq):
return [k for k,v in Counter(seq).items() if v % 2 == 1][0]
方法2:
def find_it(seq):
return [k for k in seq if seq.count(k) % 2][0]
题目:与斐波那契数列的定义式T(n)=T(n-1)+T(n-2)
类似,泰波那契数列的定义式为T(n)=T(n-1)+T(n-2)+T(n-3)
。
现在要定义一个函数,给定参数:长度为3的列表signature和非负整数n,以列表元素作为数列的前3个数,返回长度为n的泰波那契数列。
def tribonacci(signature, n):
a,b,c = signature[0], signature[1], signature[2]
for _ in range(n):
a,b,c = b,c,a+b+c
signature.append(c)
return signature[0:n]
题目:所谓的幂加数,例如2 = 2^1
,89 = 8^1 + 9^2
,135= 1^1 + 3^2 + 5^3
。定义一个函数,给定参数a和b,求出它们之间的所有幂加数,返回一个列表。
def sum_dig_pow(a, b):
return [i for i in range(a, b+1) if sum(int(v)**k for k,v in enumerate(str(i), 1)) == i]
# print(sum_dig_pow(1,100))
题目:给定一个字符串,该字符串只含字母及空格,仅当出现多个单词时才会出现空格。对于单个单词,将单词的索引为偶数的字母转换为大写,将字符串的索引为奇数的字母小写,空格依旧是空格,所有字符顺序不变。转换字符串中所有的单词,返回转换后的字符串。
def to_weird_case_word(string):
return ''.join(v.upper() if k%2 == 0 else v for k,v in enumerate(string))
def to_weird_case(string):
return ' '.join(to_weird_case_word(i) for i in string.split())
# print(to_weird_case('Weird string case'))
题目:编写一个函数,该函数接受一个数组,并将所有的0
(不是False
也不是float(0)
)移动到数组的最后,同时保持其他元素的顺序。
方法1:
def move_zeros(array):
l,count = [],0
for i in array:
if str(i) != '0' and str(i) != '0.0' or i != 0:
l.append(i)
else:
count +=1
for i in range(count):
l.append(0)
return l
# print(move_zeros([0,1,None,2,False,1,0]))
# print(move_zeros([9,0.0,0,9,1,2,0,1,0,1,0.0,3,0,1,9,0,0,0,0,9]))
方法二:
def move_zeros(array):
return sorted(array, key=lambda x: x==0 and type(x) is not bool)
题目:水仙花数是基于10进制的数字,它是自己组成数字的位数幂的和。例如,对于153(3位数):1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153
;对于1634(4位数):1^4 + 6^4 + 3^4 + 4^4 = 1 + 1296 + 81 + 256 = 1634
。
现在编写一个函数,参数是基于10进制的数字,判断该数字是否是水仙花数,结果返回True或False。
def narcissistic(value):
return sum(int(x)**len(str(value)) for x in str(value)) == value
题目:给定两个数组a和b,判断b中的元素是否是a中元素的平方,忽略顺序。编写一个函数,参数为两数组array1
和array2
,结果返回True或False。
def comp(array1, array2):
try:
return sorted([i**2 for i in array1]) == sorted(array2)
except:
return False
题目:编写一个函数persistence,它接受一个正整数num作为参数并返回将num中的数字相乘的次数,直到你得到的乘积是一个个位数为止。
from functools import reduce
def persistence(n):
count = 0
while n >= 10:
count += 1
n = reduce(lambda a,b:a*b, [int(i) for i in str(n)])
return count
题目:编写一个函数,它接受两个非负整数a和b,并返回a^b
的最后一位数。
方法1:
def last_digit(n1, n2):
return int(str(n1**n2)[-1])
该方法效率极低,不可取。
方法2:
def last_digit(n1, n2):
return pow(n1, n2, 10)
题目:编写一个函数,给定参数str1和str2,判断一个字符串str1的部分字符可以重新排列组成另一字符串str2,则返回True,否则返回False。两个字符串参数只允许使用小写字母a-z
。
分析:需要考虑字符串str1中各元素的次数必须大于等于str2。
def scramble(s1, s2):
return False if [i for i in set(s2) if s1.count(i) < s2.count(i)] else True
题目:如果两个单词都包含相同的字母,那么它们就是对应的字母组合。例如:
'abba' & 'baab' == true
'abba' & 'bbaa' == true
'abba' & 'abbba' == false
'abba' & 'abca' == false
编写一个函数,它可以从一个列表中找到一个单词的所有字母组合。 给定两个参数,一个单词和一个包含单词的数组。 应该返回所有字母组合的数组,如果没有则返回空数组。例如:
anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada']) => ['aabb', 'bbaa']
anagrams('racer', ['crazer', 'carer', 'racar', 'caers', 'racer']) => ['carer', 'racer']
anagrams('laser', ['lazing', 'lazy', 'lacer']) => []
def anagrams(word, words):
return [w for w in words if sorted(word) == sorted(w)]
题目:编写一个函数,增加一个字符串,以创建一个新的字符串。如果字符串已经以一个数字结束,则该数字应该增加1,例如:
foo => foo1
foobar23 => foobar24
foo0042 => foo0043
foo099 => foo100
分析:如果数字前面有零,则应考虑数字的数量。
方法1:
def increment_string(string):
if string.isalpha():
return string + '1'
def get_num(string):
x,s1,s2 = 1,'',''
while string[:x].isalpha():
s1 = string[:x]
s2 = string[x:]
x += 1
return s1,s2
n = str(int(get_num(string)[1]) + 1).zfill(len(get_num(string)[1]))
return get_num(string)[0] + str(n)
方法2:
def increment_string(string):
head = string.rstrip('0123456789')
tail = string[len(head):]
return string + '1' if string == '' or string.isalpha() else head + str(int(tail) + 1).zfill(len(tail))
题目:对于一个序列u,u(0) = 1
,对于在u中的每个元素x,都存在y = 2 * x + 1
和z = 3 * x + 1
,u中无重复元素。例如:
u = [1, 3, 4, 7, 9, 10, 13, 15, 19, 21, 22, 27, ...]
编写一个函数,给定参数n,返回序列u对应索引的元素u(n)。
def dbl_linear(n):
x,y,i,u = 0,0,1,[1]
while i <= n:
xx, yy = 2*u[x]+1, 3*u[y]+1
if xx < yy:
u.append(xx)
x += 1
elif xx == yy:
u.append(xx)
x += 1
y += 1
else:
u.append(yy)
y += 1
i += 1
return u[n]
题目:编写一个函数,以输入的驼峰型字符串为参数,输出蛇形字符串,且全部小写,如果参数为数字,返回数字的字符串。例如:
to_underscore('TestController') => 'test_controller'
to_underscore('MoviesAndBooks') => 'movies_and_books'
to_underscore('App7Test') => 'app7_test'
to_underscore(1) => '1'
方法1:
import re
def to_underscore(string):
def get_str(string):
pattern="[A-Z]"
return re.sub(pattern, lambda x:" "+x.group(0), string)[1:].lower()
if str(string).isdigit():
return str(string)
return '_'.join(get_str(string).split())
方法2:
import re
def to_underscore(string):
return re.sub(r'(.)([A-Z])', r'\1_\2', str(string)).lower()
题目:有n个人围成一圈,按顺序编号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
编写一个函数,给定参数n,返回最后剩下的人的编号。
def out(n):
l1,c = list(range(1, n+1)),1
while len(l1) != 1:
l2 = []
for i in l1:
if c != 3:
l2.append(i)
c += 1
if c > 3:
c -= 3
l1 = l2
return l1[0]
# print(out(34))
题目:编写一个函数,给定由至少包含1个名称的数组和单个整数n作为参数,返回喝第n杯可乐的人的名字。可乐从1开始编号,每人喝完双份可乐之后会排在队伍后面,例如,在Sheldon喝了第一罐可乐、Penny喝了第三罐可乐后,排队的人看起来是这样的:
Rajesh, Howard, Sheldon, Sheldon, Leonard, Leonard, Penny, Penny
who_is_next(["Sheldon", "Leonard", "Penny", "Rajesh", "Howard"], 1) == "Sheldon"
who_is_next(["Sheldon", "Leonard", "Penny", "Rajesh", "Howard"], 52) == "Penny"
who_is_next(["Sheldon", "Leonard", "Penny", "Rajesh", "Howard"], 7230702951) == "Leonard"
方法1:
def who_is_next(names, n):
i = 1
while i <= n:
names.append(names[0])
del names[0]
names.append(names[-1])
i += 1
return names[-1]
# print(who_is_next(["Sheldon", "Leonard", "Penny", "Rajesh", "Howard"], 52))
方法1效率较低,在n特别大时消耗时间较长。
方法2:
def who_is_next(names, n):
while n > 5:
n = (n - 4) // 2
return names[n-1]
# print(who_is_next(["Sheldon", "Leonard", "Penny", "Rajesh", "Howard"], 52))