数据结构与算法 Python语言实现 课后习题第一章
- 记录下自己写的课后习题答案
1.1
def is_multiple(n,m):
if m%n == 0:
return True
else:
return False
1.2
def is_even(k):
if k&1 == 0:
return True
else:
return False
1.3
def minmax(data):
min1 = max1 = data[0]
for i in data:
if min1 > i:
min1 = i
else:
max1 = i
return max1,min1
1.4 (1.5)
def Pfanghe(k):
return sum(j**2 for j in range(1,k+1))
1.6(1.7)
def JPfanghe(k):
return sum( j**2 for j in range(1,k+1) if j%2 != 0)
1.8
def _1_8(data,i):
return data[len(data)+i]
1.9
list1_9 = [i for i in range(50,81,10)]
1.10
list1_10 = [i for i in range(8,-9,-2)]
1.11
list1_11 = [2**i for i in range(0,9)]
1.12
def _1_12(data):
print(data[random.randrange(len(data))])
1.13
def _1_13(data):
list1=[]
for i in range(len(data)):
x = data.pop()
list1.append(x)
print(list1)
_1_13([1,2,3,4])
1.14
def _1_14(data):
data = set(data)
for i in range(len(data)):
x = data.pop()
for a in data:
if (x*a)%2 != 0:
print(x,a)
else:
pass
1.15
def _1_15(data):
x = data[:]
for i in data:
a = x.pop(len(x)-1)
if a in x:
return False
else:
pass
return True
1.16
该处data为一个列表,所以该列表内存储的是数值的引用。在函数体内部直接改变了列表内所存储的地址,所以实例参数也随之改变。
1.17
不能,此时改变的是单个数值的大小,而非改变列表内的引用
1.18
list1_18 = [i*(i+1) for i in range(0,10) ]
1.19
list1_19 = [chr(i) for i in range(97,123)]
1.20
import random
def shuffle(data):
zu = []
for i in range(len(data)):
if len(data) != 0:
e = random.randint(0,len(data)-1)
zu.append(data[e])
data.remove(data[e])
else:
break
return zu
1.21
try:
zu = []
while 1:
i = input(":")
zu.append(i)
except EOFError:
zu.reverse()
for i in range(len(zu)):
print(zu[i])
1.22
def _1_22(x,y):
z = []
if len(x) == len(y):
for i in range(len(x)):
e = x[i] * y[i]
z.append(e)
return z
else:
raise ('两参数列表长度需要一致')
1.23
try:
zu = [1,2,3,4]
x = zu[5]
print(x)
except IndexError:
print("Don not try buffer overflow attacks in python")
1.24
def _1_24(data):
key = ['a','e','i','o','u']
result = 0
for i in key:
for j in data[:]:
if i == j:
result +=1
else:
pass
return result
1.25
from string import punctuation as p #导入string包内punctuation内含(!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~)
def _1_25(s):
for i in s:
if i in p:
s = s.replace(i,' ')
else:
pass
return str(s)
1.26(这道题原题只要以固定顺序满足即可,此处我做了修改,可以以任意顺序实现即返回True)
def _1_26():
key = []
for i in range(3):
x = int(input(':'))
key.append(x)
for i in range(len(key)):
new = key[:]
new.remove(key[i])
if key[i] == new[0]+new[1]:
return True
elif key[i] == new[0]-new[1] or key[i] == new[1]-new[0]:
return True
elif key[i] == new[0]*new[1]:
return True
else:
pass
return False
1.27
#本题参考:https://blog.csdn.net/storyfull/article/details/102940318
def _1_27(x):
k = 1
key = []
while k * k < x:
if x % k == 0:
yield k
key.append(x // k)
k += 1
if k * k == x:
yield k
for i in key[::-1]:
yield i
1.28
import math
def _1_28(v, p=2):
return math.sqrt(sum(pow(x, p) for x in v))
1.29(排列任意列表)
def _1_29(data):
key = 0
from itertools import permutations #该函数返回列表内所有元素数学全排列
for i in permutations(data):
i = str(i)
print(i.replace(',',''))
key += 1
print(key)
1.30
def _1_30(n):
key = 0
while 1:
n = n/2
key += 1
if n<2:
break
return key
1.31
import math
from decimal import Decimal
def _1_31(need,give):
word = []
keyx = float(Decimal(str(give)) - Decimal(str(need))) #正常进行浮点数加减运算
a = math.modf(keyx)
if a[0] != 0:
for i in str(keyx):
word.append(i)
word.remove(".")
# long = len(word)
word.reverse()
print("找回%s张0.1元"%word[0])
word.pop(0)
if word[0] != '0':
print("找回%s张1元"%word[0])
word.pop(0)
if int(word[0]) >= 5:
print("找回1张50元")
s = int(a[0])-5
if s>0:
print("找回%s张10元"%s)
word.pop(0)
else:
print("找回%s张10元"%word[0])
word.pop(0)
if len(word) != 0:
word.reverse()
x = [str(i) for i in word]
y = str(" ".join(x))
print("找回%s张100元"%y)
1.32
def _1_32():
x = input("第一个操作数:")
while 1:
key = input("运算符:")
y = input(":")
x = str(eval(x+key+y)) #eval函数负责进行字符串内表达式的运算
print(x)
1.33
def _1_32():
while 1:
x = input(":")
x = str(eval(x))
print(x)
while 1:
key = input(":")
if key == '复位':
print("进行复位操作")
break
else:
print(eval(x+key))
1.34
def _1_34():
print("请输入:I will never spam my friends again 100次")
s = 0
e = 9
while 1:
key = input(":")
if key == 'I will never spam my friends again':
s += 1
print('第{}遍'.format(s))
if s == 100:
print("结束")
break
else:
e -= 1
print("输入错误!,重新输入")
if e == 0:
print("输入错误次数超过八次,请重新开始输入")
s = 0
1.35
#参考自https://blog.csdn.net/storyfull/article/details/102940318
import math
def _1_35(num):
prop = 1 - math.pow((364 / 365), (num * (num - 1) / 2))
return prop
1.36(在原题基础上加以改进,可以读取英文句子并统计单词频率)
import re #导入re模块,方便后续使用多个分隔符分割字符串
def _1_36(data):
a = b = data
a=re.split('[ ,.]',a) #以空格、逗号以及句号来分隔文档内容
a.pop() #去除字符串中最后一个句号分隔出的空字符串
count = len(a)
print("读取到的英文内容为:\n",b,"\n")
print("文档内含有%d个单词"%count,"单词重复情况如下\n")
key = set(a)
for i in key:
print("{:10}有 {} 个".format(i,a.count(i)))