Python经典编程题40题(一)
第1题:结尾0的个数
题目
给你一个正整数列表 L, 输出L内所有数字的乘积末尾0的个数。(提示:不要直接相乘,数字很多,相乘得到的结果可能会很大)。
输入示例
输入:L=[2,8,3,50]
输出示例
输出:2
算法
寻找列表中所有元素中,每个元素因子中2和5的个数。因为2*5等于10,所以计算出因子2和5的对数,就得到乘积末尾0的个数
def find_2(x):
tmp=x
f2=0 #记录因子2的个数
f5=0 #记录因子5的个数
while x%2==0:
f2+=1
x=x/2
while tmp%5==0:
f5+=1
tmp/=5
return f2,f5
#进行计算
L=[2,8,3,50]
a2=0 #记录列表中因子2的个数
a5=0 #记录列表中因子5的个数
for i in L:
t2,t5=find_2(i)
a2+=t2
a5+=t5
print(min(a2,a5)) #2
第2题:结尾非零数的奇偶性
题目
给你一个正整数列表 L, 判断列表内所有数字乘积的最后一个非零数字的奇偶性。如果为奇数输出1,偶数则输出0。
输入示例
输入:L = [2, 8, 3, 50]
输出示例
输出:0
算法
比较粗暴,直接累乘,然后利用算法求末尾第一个非0的数字
L=[2,8,3,50]
def find_last_isodd(x): #求解末尾第一个非0的数字
if x%10!=0:
return x%10
else:
while x%10==0:
x//=10
if x%10!=0:
return x%10
break
ji=1
for i in L:
ji*=i
if find_last_isodd(ji)%2==0:
print(0)
else:
print(1)
第3题:光棍的悲伤
题目
光棍们对1总是那么敏感,因此每年的11.11被戏称为光棍节。小Py光棍几十载,光棍自有光棍的快乐。让我们勇敢地面对光棍的身份吧,现在就证明自己:给你一个整数a,数出a在二进制表示下1的个数,并输出。
输入示例
输入:a = 7
输出示例
输出:3
算法
7的二进制是111,所以输出答案是3。这道题考的是如何将十进制整数转化为二进制数,方法就是:除二取余,逆序读取
a=7
def erjinzhi(x):
he=0
while x>0:
if x%2==1:
he+=1
x//=2
return he
print(erjinzhi(a))
第4题:大小写转换
题目
给定一个字符串a, 将a中的大写字母 转换成小写,其它字符不变,并输出
输入示例
输入:a = "KDJIskos234k,.;djfeiJ"
输出示例
输出:kdjiskos234k,.;djfeij
算法
其实这道题有很多方法,比如可以根据判断是不是大写字母,然后对其ASCII码值加32来转换等等。不过,既然是python题,就用python的方法简简单单完成啦。
需要利用lower()函数,注意lower函数只会将A-Z有效,将对应大写转换为小写,其他字符不会转换,刚好符合本题要求。
a = "KDJIskos234k,.;djfeiJ"
print(a.lower()) #输出kdjiskos234k,.;djfeij
第5题:判断三角形
题目
给你三个整数a,b,c, 判断能否以它们为三个边长构成三角形。 若能,输出YES,否则输出NO。
输入示例
输入:a = 5 b = 5 c = 5
输出示例
输出:YES
算法
三角形任意两边之和大于第三边,可以利用列表排序求出较小的两边,然后相加再和第三边比较,进行判断
a = 5
b = 5
c = 3
L=list()
L.append(a)
L.append(b)
L.append(c)
L.sort() #默认从小到大排序
if L[0]+L[1]>L[2]:
print('YES')
else:
print('NO')
#YES
第6题:逆解最大公约数与最小公倍数
题目
我们经常遇到的问题是给你两个数,要你求最大公约数和最小公倍数。今天我们反其道而行之,给你两个数a和b,计算出它们分别是哪两个数的积的最大公约数和最小公倍数。输出这两个数,小的在前,大的在后,以空格隔开。若有多组解,输出它们之和最小的那组。
输入示例
输入:a=3, b = 60
输出示例
输出:12 15
算法
最大公约数与最小公倍数的乘积就是所求的两数之积,即最大公约数*最小公倍数=a*b,然后题目要求两数和最小,在两数积不变的情况下,二者越接近,和越小。所以从积的平方根开始,求第一个能被积整除的数即可。
a=3
b=60
ji=a*b #两数之积
sq=int(pow(ji,0.5)) #积的平方根
ans_big=0
for i in range(sq,ji+1): #求解在根号附近,第一个能被整除的数(两数较大的一个)
if ji%i==0:
ans_big=i
break
print(ji//ans_big,ans_big)
第7题:公约数的个数
题目
给你两个正整数a,b, 输出它们公约数的个数。
输入示例
输入:a = 24 b = 36
输出示例
输出:6
算法
朴素的思想:从1到两数较小的数,看看是否可以同时被两数整除,若可以则结果加一
def find_yueshu(x,y):
he=0
for i in range(1,min(x,y)+1):
if x%i==0 and y%i==0:
he+=1
return he
print(find_yueshu(24,36)) #6
第8题:回文子串
题目
给你一个字符串a和一个正整数n,判断a中是否存在长度为n的回文子串。如果存在,则输出YES,否则输出NO。 回文串的定义:记串str逆序之后的字符串是str1,若str=str1,则称str是回文串,如"abcba".
输入示例
输入:a = "abcba" n = 5
输出示例
输出:YES
算法
根据正整数n进行分割字符串,然后判断字符串是不是回文串。由于python中字符串没有直接提供reverse函数(列表list有,但需要先将字符串转换为列表,较麻烦),所以采用字符串切片。若一个字符串为s,其逆序为s[::-1],前两个空表示提取全部,-1表示逆序。
a="abcbe"
n=5
flag=0
for i in range(len(a)):
if i+n>len(a): #索引超过最大值,直接提前退出
break
str_tmp=a[i:i+n]
str_tmp_reverse=str_tmp[::-1] #字符串翻转
if str_tmp==str_tmp_reverse:
flag=1
break
if flag==1:
print('YES')
else:
print('NO')
#输出YES
第9题:单身情歌
题目
抓不住爱情的我 总是眼睁睁看它溜走 ...现在来练习一下发现爱的能力,给你一个字符串a,如果其中包含"LOVE"(love不区分大小写)则输出LOVE,否则输出SINGLE。
输入示例
输入:a = "OurWorldIsFullOfLOVE"
输出示例
输出:LOVE
算法
先利用刚才学到的lower函数(学以致用hh),将原字符串转换为小写,然后利用str切片,得到一个子串,与目标子串(love)进行比较。
a = "OurWorldIsFullOfLOVE"
b=a.lower()
flag=0 #判断开关
for i in range(len(a)):
if i+4>len(a): #防止超出范围
break
tmp=b[i:i+4]
if tmp=='love':
flag=1
if flag:
print('LOVE')
else:
print('SINGLE')
第10题:信息加密
题目
给你个小写英文字符串a和一个非负数b(0<=b<26), 将a中的每个小写字符替换成字母表中比它大b的字母。这里将字母表的z和a相连,如果超过了z就回到了a。
输入示例
输入:a = "cagy" b = 3
输出示例
输出:fdjb
算法
这道题主要用到以下两个函数:
ord函数:返回字符的ASCII值
chr函数:根据ASCII值得到对应字符
利用ord函数和chr函数进行值的相互转换,如果判断字符移动后值大于z的,要转变到从a开始
a="cagy"
b=3
s=''
for i in a:
if(ord(i)+b)<=ord('z'):
s+=chr(ord(i)+b) #直接进行移动
else:
s+=chr(ord('a')-1+b-(ord('z')-ord(i))) #会超过z的,计算出再从a开始要移动的位数
print(s) #fdjb
第11题:时间就是金钱
题目
给你两个时间st和et(00:00:00<=st <= et<=23:59:59), 请你给出这两个时间间隔的秒数。 如:st="00:00:00", et="00:00:10", 则输出10。
输入示例
输入:st = "00:00:00" et = "00:00:52"
输出示例
输出:52
算法
利用python的强制类型转换,可以将字符数字转换为平台数字。str切片得到对应的小时、分钟和秒,将其全部转换为秒的进制后进行做差。
st = "00:00:00"
et = "00:00:52"
st_time=int(st[0:2])*60*60+int(st[3:5])*60+int(st[6:8]) #强制类型转换
et_time=int(et[0:2])*60*60+int(et[3:5])*60+int(et[6:8])
print(et_time-st_time) #进行做差
#输出52
第12题:365 Or 366?
题目
一年有多少天,这是个大问题,很值得思考。现在给你一个年份year(year为四位数字的字符串,如"2008","0012"), 你输出这一年的天数。如year="2013", 则输出365。
输入示例
输入:year = "2008"
输出示例
输出:366
算法
先利用python的强制类型转换,将字符年份转换为数字年份,然后判断闰年即可。闰年判断方法:可被4整除且不会被100整除或者可以被400整除
def Year_day(x):
if (x%4==0 and x%100!=0) or x%400==0:
return 366
else:
return 365
year='2008'
year_int=int(year)
print(Year_day(year_int))
第13题:格式化时间
题目
给你一个时间t(t是一个字典,共有六个字符key(year,month,day,hour,minute,second),值为每个值为数字组成的字符串, 请将其按照以下格式输出, 格式:XXXX-XX-XX XX:XX:XX。
输入示例
输入:t = {"year": "2013", "month": "9", "day": "30", "hour": "16", "minute": "45", "second": "2"}
输出示例
输出:2013-09-30 16:45:02
算法
灵活运用print函数即可,注意当位数不足时,要按照格式向前补0
t = {"year": "2013", "month": "9", "day": "30", "hour": "16",
"minute": "45", "second": "2"}
for key in t:
if key!='year':
if int(t[key])<10:
t[key]='0'+t[key]
if key=='year':
if int(t[key])<1000 and int(t[key])>=100:
t[key]='0'+t[key]
elif int(t[key])<100 and int(t[key])>=10:
t[key]='00'+t[key]
elif int(t[key])<10 and int(t[key])>=0:
t[key]='000'+t[key]
print(t['year']+'-'+t['month']+'-'+t['day']+' '+t['hour']+':'
+t['minute']+':'+t['second'])
#输出2013-09-30 16:45:02
第14题:序列判断
题目
给你一个整数组成的列表L,按照下列条件输出: 若L是升序排列的,则输出"UP"; 若L是降序排列的,则输出"DOWN"; 若L无序,则输出"WRONG"。
输入示例
输入:L = [1, 1, 3, 3, 4]
输出示例
输出:UP
算法
介绍一下列表的sort方法和sorted方法
sort:例如L.sort(),默认升序,会将原来的列表覆盖
sorted:例如sorted(L),默认升序,不会改变原来的列表
两者都可以接受reverse参数,来设置是否逆序。这道题中利用sorted方法与原来的列表进行比较即可。
L = [1, 1, 3, 3, 4]
L1=sorted(L,reverse=False) #升序
L2=sorted(L,reverse=True) #降序
if L==L1:
print('UP')
elif L==L2:
print('DOWN')
else:
print('WRONG')
第15题:相同数字
题目
给你一个整数列表L,判断L中是否存在相同的数字, 若存在,输出YES,否则输出NO。
输入示例
输入:L = [123, 432, 23]
输出示例
输出:NO
算法
先进行排序,然后一重循环进行遍历即可
L = [123, 432, 23]
flag=0
L.sort()
for i in range(len(L)-1):
if L[i]==L[i+1]:
flag=1
if flag:
print('YES')
else:
print('NO')
第16题:山峰的个数
题目
十一假期,小P出去爬山,爬山的过程中每隔10米他都会记录当前点的海拔高度(以一个浮点数表示), 这些值序列保存在一个由浮点数组成的列表h中。回到家中,小P想研究一下自己经过了几个山峰,请你帮他计算一下,输出结果。 例如:h=[0.9,1.2,1.22,1.1,1.6,0.99], 将这些高度顺序连线,会发现有两个山峰,故输出一个2(序列两端不算山峰)
输入示例
输入:h = [0.9, 1.2, 1.22, 1.1, 1.6, 0.99]
输出示例
输出:2
算法
一次遍历即可,分别比较其与前一位和后一位的大小,注意列表不要越界
h = [0.9, 1.2, 1.22, 1.1, 1.6, 0.99]
he=0
for i in range(1,len(h)-1):
if h[i]>h[i-1] and h[i]>h[i+1]:
he+=1
print(he) #2
第17题:三角形形状
题目
给以一个三角形的三边长a,b和c(边长是浮点数),请你判断三角形的形状。 若是锐角三角形,输出R, 若是直角三角形,输出Z, 若是钝角三角形,输出D, 若三边长不能构成三角形,输出W.
输入示例
输入:a = 3.0 b = 5.0 c = 4.0
输出示例
输出:Z
算法
基本的三角形判断方法,熟练使用python的流程控制方法即可
a = 3.0
b = 5.0
c = 4.0
min_v=min(a,b,c)
max_v=max(a,b,c)
mid_v=a+b+c-min_v-max_v
if min_v+mid_v<=max_v:
print('W')
else:
if pow(min_v,2)+pow(mid_v,2)>pow(max_v,2): #锐角
print('R')
elif pow(min_v,2)+pow(mid_v,2)==pow(max_v,2): #直角
print('Z')
else: #此外为钝角
print('D')
第18题:简单题之勾股定理
题目
给你直角三角形的两个直角边的边长a,b,请你求出其斜边边长,结果保留小数点后三位小数。 如a=3, b =4, 则输出5.000。
输入示例
输入:a = 3.0 b = 4.0
输出示例
输出:5.000
算法
简单的数学知识,注意使用'%.3f'%进行保留三位有效数字就可以了,此外还有round方法也可以进行类似作用
a=3.0
b=5.0
c=pow(a**2+b**2,0.5)
c='%.3f'%c
print(c)
第19题:简单题之列表转换
题目
给你一个字符串列表L,请用一行代码将列表所有元素拼接成一个字符串并输出。 如L=['abc','d','efg'], 则输出abcdefg。
输入示例
输入:L = ["abc", "d", "efg"]
输出示例
输出:abcdefg
算法
简单题确实,没什么好说的
L = ["abc", "d", "efg"]
string=str() #要先定义
for i in L:
string+=i
print(string)
第20题:简单题之输出格式练习
题目
给你一个字符串列表L,用一行代码顺序输出L中的元素,元素之间以一个空格隔开,注意行尾不要有空格,输出单独占一行。 如L=['abc','d','efg'], 则输出abc d efg。
输入示例
输入:L = ["abc", "d", "efg"]
输出示例
输出:abc d efg
算法
这里必须要介绍一下join函数
join函数:
语法:'sep'.join(s)
参数说明
sep:分隔符。可以为空 s:要连接的元素序列、字符串、元组、字典 上面的语法即:以sep作为分隔符,将seq所有的元素合并成一个新的字符串
返回值:返回一个以分隔符sep连接各个元素后生成的字符串
知道了这个函数就可以愉快地ac啦
L = ["abc", "d", "efg"]
print(' '.join(L))
# abc d efg
原文链接:http://www.jxszl.com/biancheng/python/83450.html