#Python的一些算法练习题
每天做一些算法题,并要求自己尽量地简化代码,在此记录下来,如果有更好或新颖的建议也欢迎提出。本博客会不定时更新。
如435234=251171732
x=int(input('x='))
print(x,'=',end='')
for i in range(2,x):
while(x!=1):
if(x%i==0):
print(i,'*',end='')
x/=i
else:
break
print('\b ',end='')
为了省劲用了退格符
运行结果:
x=366054
366054 =2 *3 *13 *13 *19 *19
输入
一个正整数m(1~26),表示菱形的半径(直径就是m*2+1)
输出
一个以m为半径的菱形,最外层是字母A,然后里一层是字母B,然后是C……依次排列
z=[chr(i) for i in range(65,91)]#生成一个26个大写字母的集合
m=int(input('请输入半经(1~26):'))
def sc(a,b,c):
for i in range(a,b,c):
for j in range(m-i):
print(' ', end='')
#打印空格
for j in range(2*i+1):
if j<(2*i+1)/2:
print(z[j], end='')
else:
print(z[(2*i)-j], end='')
print(' ')
#打印字母
sc(0,m,1)#打印上半个菱形
sc(m-2,-1,-1)#打印下半个菱形
运行结果:
请输入半经(1~26):5
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
ABCDCBA
ABCBA
ABA
A
输入一个有序的元素列表(必须有序),如果要查找的元素包含在其中,二分法查找返回其位置,否则返回None
def search(list,item):
low=0
high=len(list)-1
while(low<=high):
mid=round((low+high)/2)
guess=list[mid]
if(guess==item):
return mid
if(guess>item):
high=mid-1
else:
low=mid+1
return None
num=int(input('查找的对象:'))
L=[2,5,8,13,49,80]
print(search(L,num))
运行结果
查找的对象:13
3
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入第一行是两个不超过200的正整数m,n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出只有一行,共mn个数。为输入矩阵回形取数得到的结果。数之间用一一个空格分隔,行末不要有多余的空格。
eg:
输入
3 3
1 2 3
4 5 6
7 8 9
输出
1 4 7 8 9 6 3 2 5
matrix,result=[],[]
i,p=0,0
m,n=map(int,input().split())
#input().split()可在同一行对多个变量赋值
for _ in range(m):
matrix.append(input().split())
#对矩阵赋值
while p!=m*n:
L,H=n-i-1,m-i-1
for y in range(i,m-i):#向下取数
result.append(matrix[y][i])
p+=1
for x in range(i+1,n-i):#向右取数
result.append(matrix[H][x])
p+=1
for y in range(H-1,i-1,-1):#向上取数
result.append(matrix[y][L])
p+=1
for x in range(L-1,i,-1):#向左取数
result.append(matrix[i][x])
p+=1
i+=1
#当取得的数的个数与矩阵元素的个数相等时,循环结束
for m in range(p-1):
print(result[m],end=' ')
print(result[p-1])
#输出
运行结果
5 6
2 8 4 9 6 5
4 1 3 4 8 9
2 6 4 8 1 7
5 3 6 8 2 1
9 4 8 7 6 1
2 4 2 5 9 4 8 7 6 1 1 7 9 5 6 9 4 8 1 6 3 6 8 2 1 8 4 3 4 8
单纯的计算
def fangcha(List):
return(sum(((float(sum(List))/len(List)-x)**2 for x in List))/len(List))
任意数分三组,使得每组的和尽量相等
yu=[3, 8, 20, 15, 60, 1, 32]
c=yu[:3]
for x in range(3,len(yu)):
c.sort()
if(c[0]+c[1]>yu[x]):
c[0]+=yu[x]
else:
c[0],c[1]=c[0]+c[1],yu[x]
print(c)
运行结果
[53, 26, 60]
得出来的并不是最优解,以后再改进
输入一个字符串统计其中的每个字母的出现的次数(不区分大小写),并以垂直柱状图的形式输出
import string
s=input()
zm=[0]*26
small=string.ascii_lowercase
large=string.ascii_uppercase
'''
large,small=[]
large.append((chr(i)+ord('A')) for i in range(26))
small.append((chr(i)+ord('a')) for i in range(26))
'''
for i in range(len(s)):
for x in range(26):
if(s[i]==small[x] or s[i]==large[x]):
zm[x]+=1
M=max(zm)
for i in range(M):
m=max(zm)
for j in range(26):
if(zm[j]==m&m!=0):
print('-',end='')
zm[j]-=1
else:
print(' ',end='')
print('')
for x in large:
print(x,end='')
运行结果
aaaadddnnnnnppciyyyyzzzz
-
- - --
- - - --
- - - - --
- -- - - - --
ABCDEFGHIJKLMNOPQRSTUVWXYZ