1. 程式人生 > >數據結構列表練習

數據結構列表練習

python

數據結構列表練習

1、求10萬內的所有素數
import datetime
start=datetime.datetime.now()
import math
primenumber = [2]
flag = False
for i in range(3,100000,2):
if i > 10 and i % 10 == 5:
continue
edge = math.ceil(math.sqrt(i))
for j in primenumber:
if i % j == 0 :
flag = True
break
if j >= edge:
flag = False
break
if not flag:
print(i)
primenumber.append(i)
delta = (datetime.datetime.now() - start).total_seconds() #時間計算
print(delta)

2、計算楊輝三角前6行
(1)方法1:補頭和尾,中間循環
triangle = [[1],[1,1]]
n = 6
for i in range(2,n):
newline = [1]
pre = trangle[i-1]
for j in range(i-1):
val = pre[j] + pre[j+1]
newline.append(val)
newline.append(1)
trangle.append(newline)
print(trangle)

(2)方法1變體
n = 6
for i in range(n): #如果不想每次判斷,則把[1]放在循環外邊
newline = [1]
if i == 0:
print(newline)
continue
for j in range(i-1):
val = pre[j] + pre[j+1]
newline.append(val)
newline.append(1)
print(newline)
pre = newline

(3)方法2:尾部補0法
n = 6
for i in range(1,n):
if i == 0:
newline = [1]
print(newline)
newline.append(0)
oldline = newline
continue
newline = []
for j in range(i+1):
newline.append(oldline[j-1] + oldline[j])
print(newline)
newline.append(0)
oldline = newline

(4)方法2變體:尾部補0法
n = 6
newline = [1]
print(newline)
newline.append(0)
for i in range(1,n):
newline = []
for j in range(i+1):
newline.append(oldline[j-1] + oldline[j])
print(newline)
newline.append(0)
oldline = newline

(5)方法3:一次性開辟空間,再對稱。
n = 6
triangle = []
for i in range(n):
row = [1] * (i+1) #一次性開辟
triangle.append(row)
for j in range(1,i//2+1): # i=2,第三行才能進來
val = triangle[i-1][j-1] + triangle[i-1][j]
row[j] = val
if i != 2*j: #奇數個數的中點跳過
row[-j-1] = val
print(triangle)

(6)方法4:單行覆蓋
n = 6
row = [1] * n #一次性開辟足夠的空間
for i in range(n):
offset = n - i
z = 1 #因為會有覆蓋影響計算,所以引入一個臨時變量
for j in range(1,i//2+1):
val = z + row[j]
row[j],z = val,row[j]
if i != 2*j:
row[-j-offset] = val
print(row[:i+1])

3、依次接收用戶輸入的3個數,排序後打印
(1)分支結構
nums = []
out = None
for i in range(3):
nums.append(int(input('{}: '.format(i))))
if nums[0]>nums[1]:
if nums[1]>nums[2]:
out = [0,1,2]
elif nums[0]>nums[2]:
out = [0,2,1]
else:
out = [2,0,1]
elif nums[0]>nums[2]:
out = [1,0,2]
elif nums[1]>nums[2]:
out = [1,2,0]
else:
out = [2,1,0]
out.reverse()
for i in out:
print(nums[i],end=',')

(2)max函數
nums = []
out = None
for i in range(3):
nums.append(int(input('{}: '.format(i))))
#此處不能使用for循環,不能一邊叠代該列表,同時刪除或者增加該列表
while True:
cur = max(nums)
print(cur)
nums.remove(cur)
if len(nums) == 1:
print(nums[0])
break

(3)列表sort實現
nums = []
for i in range(3):
nums.append(int(input('{}: '.format(i))))
nums.sort()
print(nums)

4、經典冒泡法。
(1)初始實現
lst = [9,5,1,2,6]
length = len(lst)
for i in range(length):
for j in range(length-1-i):
if lst[j] > lst[j+1]:
lst[j], lst[j+1] = lst[j+1], lst[j]
print(lst)

(2)優化實現
lst = [9,5,1,2,6]
length = len(lst)
for i in range(length):
flag = False
for j in range(length-1-i):
if lst[j] > lst[j+1]:
lst[j], lst[j+1] = lst[j+1], lst[j]
flag = True
if not flag:
break
print(lst)

數據結構列表練習