Python经典编程题40题(二)
Python经典编程题40题(二)
题目
给你一个list L, 如 L=[2,8,3,50], 对L进行降序排序并输出, 如样例L的结果为[50,8,3,2]
输入示例
输入:L = [4, 2, 25, 7777777, 100, 3, 77777777, 77777777, 77777777, 77777777]
输出示例
输出:[77777777, 77777777, 77777777, 77777777, 7777777, 100, 25, 4, 3, 2]
算法
sort方法(会覆盖原函数),这道题要设置reverse进行倒序排序
L = [4, 2, 25, 7777777, 100,
3, 77777777, 77777777, 77777777, 77777777]
L.sort(reverse=True)
print(L)
第22题:买苹果
题目
小明的妈妈买了N个苹果,想把它们都分给她的M个孩子。为了公平起见, 她想让所有的孩子都分到一样多的苹果。那么她至少要再买多少个苹果呢? 如:N=3, M=1, 则输出0 N=3,M=2,则输出1
输入示例
输入:N = 3 M = 1
输出示例
输出:0
算法
分情况,若刚好够分,则直接输出0,否则,用总共需要购买的苹果树减去N(已经有的苹果数)
N = 3
M = 1
if N%M==0:
print('0')
else:
print(M*(N//M+1)-N)
第23题:Py扔铅球
题目
Py不但是编程大牛,而且是运动健将。比如说扔铅球,1000m,现在Py参加校园扔铅球比赛, 给你Py的身高a(双精度数),球落地点与Py头部的连线与水平线的夹角 b(弧度), 要你编写一个程序计算Py扔铅球的水平距离。 a,b都是浮点数,注意b是弧度,其中, 140 < a < 200, 0 < b < 1.5. 输出你求出的水平距离,保留到小数点后三位。 如,a = 165.5, b=1.1, 则输出84.234
输入示例
输入:a = 165.5 b = 1.1
输出示例
输出:84.234
算法
利用math里面的tan函数,注意tan函数输入的值是弧度值,根据tan的定义,
身高/水平距离=tan(b),可以反解出水平距离
import math
a = 165.5
b = 1.1
print('%.3f'%(a/math.tan(b)))
第24题:回文数 I
题目
若一个数(首位不为0)从左到右读与从右到左读都是一样,这个数就叫做回文数,例如12521就是一个回文数。 给定一个正整数,把它的每一个位上的数字倒过来排列组成一个新数,然后与原数相加,如果是回文数则停止,如果不是,则重复这个操作,直到和为回文数为止。给定的数本身不为回文数。 例如:87则有: STEP1: 87+78=165 STEP2: 165+561=726 STEP3: 726+627=1353 STEP4: 1353+3531=4884 现在给你一个正整数M(12 <= M <= 100),输出最少经过几步可以得到回文数。如果在8步以内(含8步)不可能得到回文数,则输出0。 例如:M=87,则输出4.
输入示例
输入:M = 12
输出示例
输出:1
算法
回文数的判断+while循环的使用,代码很简单,只是看起来长了点
def is_huiwen(x):
y=str(x)
y_reverse=y[::-1]
if y==y_reverse:
return True
else:
return False
M=12
times=0
while is_huiwen(M)==False:
times+=1
M_re=int(str(M)[::-1]) #先将M转成字符串,再翻转,再转成数字
M+=M_re
if times<=8:
print(times)
else:
print('0')
#输出1
第25题:数数
题目
给你一个正整数n(0 < n < 1000000), 请你输出0到n之间“1”出现的次数。 例如 n = 4时, [1, 2, 3, 4]出现了1个"1",因此输出1 n = 12时,[1,2,3,4,5,6,7,8,9,10,11,12]出现了5个"1", 因此输出5
输入示例
输入:n = 3
输出示例
输出:1
算法
找1,然后计数
n=11
ans=0
def find_1(x): #找一个数中含1的个数
times_1=0
while x!=0:
if x%10==1:
times_1+=1
x//=10
return times_1
for i in range(1,n+1):
ans+=find_1(i)
print(ans)
第26题:再谈数数
题目
给定两个正整数a, b (1<=a <= b<=10^5), 请你数出在a到b之间,十个阿拉伯数字分别出现了多少次。比如,当a=11, b=20时,a和b之间的数有[11,12,13,14,15,16,17,18,19,20],那么0-9这10个数出现的次数分别是1,10,2,1,1,1,1,1,1,1。现在给你a和b,请你输出十个阿拉伯数字分别出现的次数;分十行输出,第一行表示0出现的次数,第二行表示1出现的次数,....,最后一行表示9出现的次数。
输入示例
输入:a = 11 b = 20
输出示例
输出:1, 10, 2, 1, 1, 1, 1, 1, 1, 1 (按行输出)
算法
利用一个列表来存储答案,根据下标进行索引
a = 11
b = 20
ans=[0 for i in range(10)] #构造全0列表,作为答案的存储载体
for i in range(a,b+1):
while i!=0: #算每个位数出现
ans[i%10]+=1
i//=10
for i in ans:
print(i)
第27题:Py数
题目
Py从小喜欢奇特的东西,而且天生对数字特别敏感,一次偶然的机会,他发现了一个有趣的四位数2992, 这个数,它的十进制数表示,其四位数字之和为2+9+9+2=22,它的十六进制数BB0,其四位数字之和也为22, 同时它的十二进制数表示1894,其四位数字之和也为22,啊哈,真是巧啊。 Py非常喜欢这种四位数,由于他的发现,所以这里我们命名其为Py数。 现在给你一个十进制4位数n,你来判断n是不是Py数,若是,则输出Yes,否则输出No。
输入示例
输入:n = 1234
输出示例
输出:No
算法
分别计算其十进制、十二进制和十六进制下的各数字之和,然后再比较即可
n=1234
def get_10(n):
he=0
while n!=0:
he+=n%10
n//=10
return he
def get_16(n):
he=0
while n!=0:
he+=n%16
n//=16
return he
def get_12(n):
he=0
while n!=0:
he+=n%12
n//=12
return he
if get_10(n)==get_12(n) and get_12(n)==get_16(n):
print('Yes')
else:
print('No')
#No
第28题:考古学家的困境
题目
一个考古学家正在发掘古代的一座城市时,不小心被一个部分毁坏的石墙绊倒了。 那个石墙上有数行奇异的数。这些数的前几位完整无缺,但不幸地,其余位的数字由于侵蚀作用而无法辨认。 尽管如此,他注意到每一行完好的数字都像是2的幂的前几位,他就猜想这个石墙上原先的所有数都是2的幂。 为了验证自己的想法,他选择了能看清楚的一些数写成列表,并把列表交给你, 请你求出最小的2的幂使幂的前若干位与他提供的列表中的数一致。 所以你必须写一个程序,对于给定的整数N(1 <= N <= 100),求出最小的指数E使这个数的前若干位与N相同。 注意:N的长度必须小于2^E的长度的一半。如N=1,当E等于4时,虽然2^4=16, 但因为1的长度等于16的长度的一半,所以不满足题上的条件,而只有在E等于7时,2^7=128才满足题意。 因此,N = 1时, 输出7
输入示例
输入:N = 1
输出示例
输出:7
算法
题目有点长,但是很好解,如代码
N=1 # 1<=N<=100
if N>=1 and N<10: #计算N的位数
wei=1
elif n==100:
wei=3
else:
wei=2
mi=1
while True:
get_mi=pow(2,mi)
get_mi_str=str(get_mi) #转换为str好进行操作
if get_mi_str[:wei]==str(N) and len(get_mi_str)>2*wei: #满足两个条件
print(mi)
break
mi+=1
第29题:最小公倍数I
题目
给你一个正整数list L, 如 L=[2,8,3,50], 求列表中所有数的最小公倍数(不用考虑溢出问题)。 如L=[3,5,10], 则输出30
输入示例
输入:L = [3, 6, 22]
输出示例
输出:66
算法
两数的乘积=两数最小公倍数*两数最大公约数
def find_min_bei(x,y): #求两个数的最小公倍数
ji=x*y
for i in range(min(x,y),0,-1): #不包括0
if x%i==0 and y%i==0:
return ji//i
L=[3,6,22]
gongbei=1
for i in range(len(L)):
gongbei=find_min_bei(gongbei,L[i])
print(gongbei)
第30题:整数解
题目
给你两个整数a和b(-10000<a,b<10000),请你判断是否存在两个整数,他们的和为a,乘积为b。 若存在,输出Yes,否则输出No
输入示例
输入:a=9,b=15
输出示例
输出:No
算法
假设两数分别是x和y,则有x*y=b,x+y=a;那么可以得到x*(a-x)=b,可以通过一层循环进行求解
a=9
b=15
flag=0
for i in range(-10000,10000+1):
if i*(a-i)==b:
flag=1
if flag:
print('Yes')
else:
print('No')
第31题:一马当先
题目
下过象棋的人都知道,马只能走'日'字形(包括旋转90°的日),现在想象一下,给你一个n行m列网格棋盘, 棋盘的左下角有一匹马,请你计算至少需要几步可以将它移动到棋盘的右上角,若无法走到,则输出-1. 如n=1,m=2,则至少需要1步;若n=1,m=3,则输出-1。
输入示例
输入:n = 1 m = 2
输出示例
输出:1
算法
宽搜即可,开一个数组判断是否访问过(防止无限循环),开一个数组记下步数,若终点未经过,则输出-1。
import queue
q = queue.Queue()
dx = (1, 1, 2, 2, -1, -1, -2, -2)
dy = (2, -2, 1, -1, 2, -2, 1, -1)
n = 1
m = 2
vis = [[0] * (m + 1) for i in range(n + 1)]
dis = [[0] * (m + 1) for i in range(n + 1)]
q.put((0, 0))
vis[0][0]=1
while not q.empty():
x, y = q.get()
vis[x][y] = 1
for i in range(8):
xx = x + dx[i]
yy = y + dy[i]
if (xx >= 0 and xx <= n) and (yy >= 0 and yy <= m) and not vis[xx][yy]:
q.put((xx, yy))
dis[xx][yy]=dis[x][y]+1
print(dis[n][m] if dis[n][m] != 0 else -1)
第32题:分拆素数和
题目
把一个偶数拆成两个不同素数的和,有几种拆法呢? 现在来考虑考虑这个问题,给你一个不超过10000的正的偶数n, 计算将该数拆成两个不同的素数之和的方法数,并输出。 如n=10,可以拆成3+7,只有这一种方法,因此输出1.
输入示例
输入:n = 4
输出示例
输出:0
算法
先找出n以内的素数,然后对素数列表进行穷举相加即可。
本来考虑使用素数筛来做的,因为普通素数求法时间复杂度是O(n^2),素数筛是O(nlogn),不过题目规模较小(n<10000),就不需要了。
def getsu(a): #求素数
lista=[]
for i in range(2,a+1):
flag=0
for j in range(2,i):
if i%j==0:
flag=1
break
if(not flag):
lista.append(i)
return lista
n=10
res=0
su_list=getsu(n)
for i in su_list:
for j in su_list:
if i+j==n and i!=j:
#print(i,j)
res+=1
print(res//2)
第33题:那些年我们集过的卡片
题目
不知道大家的童年有没有过和我相似的经历。我记得小时候经常买干脆面,不为别的,只是因为里面有一张人物卡片。 其实有很多这样的活动都有一个相同的模式:N 种人物卡片,每次买一包干脆面随机得到一张。当你集齐这 N 种人物时,就会有相应的奖励。 那时候还不懂怎么计算概率,白白给人家送了好多钱,吃了好多干脆面。 现在的任务是,给你一个正整数 N (1 <= N <= 10^4),请你帮我从期望的角度计算平均需要买多少包干脆面才能集齐这 N 种人物。 提醒:由于结果可能不是整数,所以结果只保留到小数点后两位。
输入示例
输入:N = 1
输出示例
输出:1.00
算法
- N=1,1种卡片,怎么买都可以买到,期望就是 1
- N=2,2种卡片,拿到第1种以后,拿到第2种的概率就是 1/2, 理论上还需要买2包。期望和 = 3/3 + 2/1
- N=3,3种卡片, 拿到第1种以后,拿到第2种的概率就是2/3, 理论上需要买 3/2 包,再拿到第3种的概率就是 1/3 ,理论上需要买 3/1 包。 期望和 = 3/3 + 3/2 + 3/1
- 以此类推,N时,期望为1+(N-1)/N+(N-2)/N+...+1/N。
N=4
res=0.0
for i in range(N,0,-1):
res+=(N*1.0)/i
print('{:.2f}'.format(res))
第34题:切西瓜
题目
小Py要吃西瓜,想知道切了n刀后,最多能切出多少块?请你们帮助下小Py. 给你一个正整数n(0 < n < 10^3),你输出一个数字,代表最多能切多少块。 如n=1, 输出2。
输入示例
输入:n = 1
输出示例
输出:2
算法
这道题本质上就是求n个平面能把一个空间划分为几个部分,有公式 �3+5�+66 。
print((n*n*n+5*n+6)//6)
第35题:超级楼梯
题目
有一楼梯共n级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第n级,共有多少种走法? 现在给你一个正整数n,求走法数
输入示例
输入:n = 2
输出示例
输出:1
算法
这其实就是一个斐波拉契数列。也可以用动态规划的思想来看,第n阶楼梯,可以从n-1阶和n-2阶走来,那么第n阶楼梯的走法就是前两阶楼梯的走法数相加。
斐波拉契数列可以用递归来做,也可以用递推来做,递推效率更高,下面是递推写法:
l = []
for i in range(n):
if i == 0 or i == 1:
l.append(1)
else:
l.append(l[i-1]+l[i-2])
# for i in range(n):
# print(l[i])
print(l[n-1]) #因为下标从0开始
第36题:最大非连续子序列
题目
给你一个整数list L, 如 L=[2,-3,3,50], 求L的一个非连续子序列,使其和最大,输出最大子序列的和。 这里非连续子序列的定义是,子序列中任意相邻的两个数在原序列里都不相邻。 例如,对于L=[2,-3,3,50], 输出52(分析:很明显,该列表最大非连续子序列为[2,50]).
输入示例
输入:L = [2, -3, 3, 50]
输出示例
输出:52
算法
这是一道非常典型且基础的动态规划题目。当前的状态量,为1~n-2的状态值转移得来,那么我们可以通过两层循环,外层表示状态遍历,内层表示状态转移。
L = [2, -3, 3, 50,30]
l=[L[i] for i in range(len(L))]
for i in range(2,len(L)): #下标为0和1处,不能转移,所以从2开始
q=l[0]
for j in range(i-1): #到自身前两位为止
q=max(q,l[j])
if q>0: #如果前面的状态有大于0的,就更新当前状态
l[i]=l[i]+q
#print(q,L[i],l[i])
#遍历找出最大的状态值
a=l[0]
for i in l:
if i>a:
a=i
print(a)
第37题:最大连续子序列
题目
给你一个整数list L, 如 L=[2,-3,3,50], 求L的一个连续子序列,使其和最大,输出最大子序列的和。 例如,对于L=[2,-3,3,50], 输出53(分析:很明显,该列表最大连续子序列为[3,50]).
输入示例
输入:L = [2, -3, 3, 50]
输出示例
输出:53
算法
这道题也是一道动态规划的基础题,因为题目要求是连续序列,所以转移只能来自前一个状态量,那么只需要一层循环就可以结束。
L = [2, -3, 3, 50]
l=[L[i] for i in range(len(L))]
for i in range(1,len(L)):
if l[i-1]>0: # 若前一个状态量大于0,可以转移到本状态(使本状态的值更高)
l[i]=l[i-1]+l[i]
a=l[0]
for i in l:
if i>a:
a=i
print(a)
第38题:异或求和
题目
给你一个正整数N(1 <= N <= 100000000000000000),求1^2^3^...^N的值。A^B表示A和B按位异或。 如N=3, 则输出0.
输入示例
输入:N = 3
输出示例
输出:0
算法
找规律题,将N除以4取余,根据余数得到不同的结果。这题不能暴力相异做,肯定会卡这种算法的。
if N%4==0:
print(N)
elif N%4==1:
print('1')
elif N%4==2:
print(N+1)
elif N%4==3:
print('0')
第39题:分解 n!
题目
给你一个数 n (1 < n <= 1000000) ,求 n! (n的阶乘)的质因数分解形式. 质因数分解形式为: n=p1^m1*p2^m2*p3^m3…… *,这里 p1 < p2 < p3 < …… 为质数。如:n=6,则输出:6=2^4*3^2*5 n=7,则输出:7=2^4*3^2*5*7
输入示例
输入:n = 7
输出示例
输出:7=2^4*3^2*5*7
算法
直接遍历即可,因为数据范围较小。
n=7
l=[0 for i in range(1000010)]
# print(len(l))
def findyin(a):
m = int(a ** 0.5)
#print(m)
for i in range(2,m+1):
while a%i==0:
l[i]+=1
a//=i
if a>1:
l[a]+=1
for i in range(2,n+1):
findyin(i)
if n==1:
print("1=1")
else:
a=str()
a=a+str(n)+"="
for i in range(2,1000010):
if l[i]==1:
a=a+str(i)+"*"
if l[i]>1:
a=a+str(i)+"^"+str(l[i])+"*"
print(a[0:len(a)-1])
第40题:全排列
题目
给你一个仅有小写字母组成的字符串s(len(s) < 10),请你输出s内的所有字母的全排列,每行输出一个, 按照字典序升序输出。 如:s="bbjd",则输出: bbdj bbjd bdbj bdjb bjbd bjdb dbbj dbjb djbb jbbd jbdb jdbb
输入示例
输入:s = "bbjd"
输出示例
输出:bbdj bbjd bdbj bdjb bjbd bjdb dbbj dbjb djbb jbbd jbdb jdbb
算法
利用全排列函数即可,注意输出前要排序(按照字典序)
from itertools import permutations
ans = set()
for item in permutations(s):
ans.add("".join(item))
ans = list(ans)
ans.sort()
for i in ans:
print(i)
Python经典编程题40题(二)的更多相关文章
- python 网络编程:socket(二)
上节地址:Python网络编程:socket 一.send和sendall区别 send,sendall ret = send('safagsgdsegsdgew') #send 发送 ...
- JAVA经典算法面试40题及答案
现在是3月份,也是每年开年企业公司招聘的高峰期,同时有许多的朋友也出来找工作.现在的招聘他们有时会给你出一套面试题或者智力测试题,也有的直接让你上机操作,写一段程序.算法的计算不乏出现,基于这个原因我 ...
- python异步编程模块asyncio学习(二)
尽管asyncio应用通常作为单线程运行,不过仍被构建为并发应用.由于I/O以及其他外部事件的延迟和中断,每个协程或任务可能按一种不可预知的顺序执行.为了支持安全的并发执行,asyncio包含了thr ...
- python高级编程——入门语法(二)
闭包 概念:外函数outer定义一个变量a,又定义一个内函数inner,而这个内函数inner访问了外函数outer的变量a,如果需要改变外函数outer的变量a的值,则需要声明 nonlocal a ...
- python函数式编程之装饰器(二)
以前用装饰器,都是定义好了装饰器后,使用@装饰器名的方法写入被装饰函数的正上方 在这里,定义的装饰器都是没有参数的 在定义装饰器的函数的时候,没有在括号里定义参数,这就叫做无参装饰器 既然有无参装饰器 ...
- python核心编程2 第十二章 练习
12–5. 使用 __import__().(a) 使用 __import__ 把一个模块导入到你的名称空间. 你最后使用了什么样的语法? (b) 和上边相同, 使用 __import__() 从指定 ...
- JAVA经典算法40题及解答
JAVA经典算法40题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分 ...
- JAVA经典算法40题
1: JAVA经典算法40题 2: [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 3 ...
- JAVA经典算法40题(原题+分析)之分析
JAVA经典算法40题(下) [程序1] 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: ...
- JAVA经典算法40题(原题+分析)之原题
JAVA经典算法40题(上) [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? [程 ...
随机推荐
- 高效运营新纪元:智能化华为云Astro低代码重塑组装式交付
摘要:程序员不再需要盲目编码,填补单调乏味的任务空白,他们可以专注于设计和创新:企业不必困惑于复杂的开发过程,可以更好地满足客户需求以及业务策略迭代. 本文分享自华为云社区<高效运营新纪元:智能 ...
- day-3 路由底层源码
1. 定义路由本质 比如在url.py定义以下路由,浏览器中输入http://192.168.0.1:8000/user/2003-04-21可以访问 意味着此url http://192.168.0 ...
- uni-app学习之路
MVC模式1. model:模型层,数据的增删改查2. view:视图层,前端页面3. controller:控制层,处理业务 文件页面结构1. 页面以`.vue`结尾2. `template`,`s ...
- Flask工厂模式蓝图使用Celery实例【亲测可用,已应用于项目中】
单一模式运行Celery在官方文档中已经贴出范例代码,这里我们不过多介绍. 在使用Flaks编写大型项目时,使用工厂模式的好处显而易见.因在Celery4.x以上版本已经抛弃了init_app方法,所 ...
- elasticsearch中的数据类型search_as_you_type及查看底层Lucene索引
search_as_you_type字段类型用于自动补全,当用户输入搜索关键词的时候,还没输完就可以提示用户相关内容.as_you_type应该是说当你打字的时候.它会给索引里的这个类型的字段添加一些 ...
- 【JMeter】常用线程组设置策略
常用线程组设置策略 目录 常用线程组设置策略 一.前言 二.单场景基准测试 1.介绍 2.线程组设计 3.测试结果 三.单场景并发测试 1.介绍 2.线程组设计 3.测试结果 四.单场景容量/爬坡测试 ...
- svg动画 - 波浪动画
波浪 <path d="M 96.1271 806.2501 C 96.1271 806.2501 241.441 755.7685 384.5859 755.7685 C 529.8 ...
- .NET API 中的 FromRoute、FromQuery、FromBody 用法
原文链接:https://www.cnblogs.com/ysmc/p/17663663.html 最近技术交流群里,还有不少小伙伴不知道 FromRoute.FromQuery.FromBody 这 ...
- android webview调用js(vue)问题记录
这几天和别人对接移动端,安卓平台,我们这边输出vue界面,安卓方反馈轮询的时候调用不到,具体原因也定位不到,只能确定前端这边没几句代码,应该没有问题,因此决定自己下载个android studio写个 ...
- 数据可视化【原创】vue+arcgis+threejs 实现流光边界线效果
本文适合对vue,arcgis4.x,threejs,ES6较熟悉的人群食用. 效果图: 素材: 主要思路: 先用arcgis externalRenderers封装了一个ExternalRender ...