問題1:二維數組處理
定義一個20*5的二維數組,用來存儲某班級20位學員的5門課的成績;這5門課按存儲順序依次爲:core C++,coreJava,Servlet,JSP和EJB。
(1)循環給二維數組的每一個元素賦0~100之間的隨機整數。
(2)按照列表的方式輸出這些學員的每門課程的成績。
(3)要求編寫程序求每個學員的總分,將其保留在另外一個一維數組中。
(4)要求編寫程序求所有學員的某門課程的平均分。
from __future__ import division
import random
def score(score_list,course_list,student_num):
course_num = len(course_list)
every_score = [[score_list[i][j] for i in range(len(course_list))] for j in range(student_num)]
every_total = [sum(every_score[i]) for i in range(student_num)]
ave_score = [sum(score_list[i]) / student_num for i in range(len(course_list))]
return (every_score, every_total, ave_score)
if __name__ == "__main__":
course_list = ["Java","C++","Python","Perl","Servlet"]
student_num = 20
score_list = [[random.randint(0, 100) for i in range(student_num)] for j in range(len(course_list))]
print score_list
for i in range(len(course_list)):
print "score of everyone in %s:"%course_list[i]
print score_list[i]
every_score,every_total,ave_score = score(score_list,course_list,student_num)
print "\n"
for name in course_list:
print name,
print "\t"
print every_score
print "\n"
print "every one all score: \t",every_total
print "every one ave score: \t",ave_score
[[18, 87, 24, 82, 63, 28, 6, 100, 74, 24, 71, 35, 8, 1, 32, 23, 76, 62, 80, 59], [61, 66, 8, 97, 2, 98, 1, 26, 50, 61, 60, 48, 60, 59, 56, 43, 51, 25, 59, 41], [47, 76, 55, 95, 71, 25, 86, 17, 37, 69, 29, 100, 64, 13, 100, 48, 77, 35, 32, 89], [27, 54, 68, 5, 68, 23, 80, 20, 34, 68, 59, 65, 34, 79, 44, 86, 60, 51, 100, 89], [67, 24, 24, 43, 98, 90, 9, 72, 57, 41, 26, 33, 27, 47, 75, 60, 64, 6, 40, 5]]
score of everyone in Java:
[18, 87, 24, 82, 63, 28, 6, 100, 74, 24, 71, 35, 8, 1, 32, 23, 76, 62, 80, 59]
score of everyone in C++:
[61, 66, 8, 97, 2, 98, 1, 26, 50, 61, 60, 48, 60, 59, 56, 43, 51, 25, 59, 41]
score of everyone in Python:
[47, 76, 55, 95, 71, 25, 86, 17, 37, 69, 29, 100, 64, 13, 100, 48, 77, 35, 32, 89]
score of everyone in Perl:
[27, 54, 68, 5, 68, 23, 80, 20, 34, 68, 59, 65, 34, 79, 44, 86, 60, 51, 100, 89]
score of everyone in Servlet:
[67, 24, 24, 43, 98, 90, 9, 72, 57, 41, 26, 33, 27, 47, 75, 60, 64, 6, 40, 5]
Java C++ Python Perl Servlet
[[18, 61, 47, 27, 67], [87, 66, 76, 54, 24], [24, 8, 55, 68, 24], [82, 97, 95, 5, 43], [63, 2, 71, 68, 98], [28, 98, 25, 23, 90], [6, 1, 86, 80, 9], [100, 26, 17, 20, 72], [74, 50, 37, 34, 57], [24, 61, 69, 68, 41], [71, 60, 29, 59, 26], [35, 48, 100, 65, 33], [8, 60, 64, 34, 27], [1, 59, 13, 79, 47], [32, 56, 100, 44, 75], [23, 43, 48, 86, 60], [76, 51, 77, 60, 64], [62, 25, 35, 51, 6], [80, 59, 32, 100, 40], [59, 41, 89, 89, 5]]
every one all score: [220, 307, 179, 322, 302, 264, 182, 235, 252, 263, 245, 281, 193, 199, 307, 260, 328, 179, 311, 283]
every one ave score: [47.65, 48.6, 58.25, 55.7, 45.4]
問題2:數組元素的移動
定義一個int型的一維數組,包含10個元素,分別賦值爲1~10, 然後將數組中的元素都向前移一個位置,
即,a[0]=a[1],a[1]=a[2],…最後一個元素的值是原來第一個元素的值,然後輸出這個數組。
def move_forward():
a = [i for i in range(10)]
print a
b = a.pop(0)
a.append(b)
return a
if __name__ == "__main__":
print move_forward()
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
問題3:求list的平均分並排序
定義一個int型的一維數組,包含40個元素,用來存儲每個學員的成績,循環產生40個0~100之間的隨機整數, (1)將它們存儲到一維數組中,然後統計成績低於平均分的學員的人數,並輸出出來。 (2)將這40個成績按照從高到低的順序輸出出來。
from __future__ import division
import random
def less_average(score):
ave_score = sum(student_score) / student_num
less_ave = [i for i in score if i < ave_score]
return less_ave
if __name__ == "__main__":
student_num = 40
student_score = [random.randint(0,100) for i in range(student_num)]
print "less than the average score :",less_average(student_score)
print "every score form high to samll:",sorted(student_score,reverse = True)
問題4:二分查找的python模塊
def binary_search(list,value,high,low):
if high < low:
return -1
mid = (low + high)/2
if list[mid] < value:
return binary_search(list,value,high,mid+1)
elif list[mid] > value:
return binary_search(list,value,mid-1,low)
else:
return list[mid]
def bsearch(l,value):
lo,hi = 0,len(l)-1
while lo <= hi:
mid = (hi+lo) / 2
if mid < value:
lo = mid+1
elif mid > value:
hi = mid -1
else:
return mid
return -1
if __name__ == "__main__":
l = range(50)
print binary_search(l,12,49,0)
print bsearch(l,15)
Method2:
from bisect import *
def bisectSearch(lst, x):
i = bisect_left(lst, x) #bisect_left(lst,x),得到x在已經排序的lst中的位置
if i != len(lst) and lst[i] == x:
return i
raise ValueError
if __name__=="__main__":
lst = sorted([2,5,3,8])
print bisectSearch(lst,5)
問題5:二叉樹查找之基本思想
class Node:
def __init__(self,data):
self.left = None
self.right = None
self.data = data
def insert(self,data):
if data < self.data:
if self.left is None:
self.left = Node(data)
else:
self.right = Node(data)
else:
if self.left is None:
self.left = Node(data)
else:
self.right = Node(data)
0
def lookup(self,data,parent = None):
if data < self.data:
if self.left is None:
return None,None
return self.left.lookup(data,self)
elif data > self.data:
if self.right is None:
return None,None
return self.right.lookup(data,self)
else:
return self,parent
def children_count(self):
cnt = 0
if self.left:
cnt +=1
if self.right:
cnt += 1
return cnt
def delete(self,data):
node,parent = self.lookup(data)
if node is not None:
children_count = node.children_count()
if children_count == 0:
if parent.left is node:
parent.left = None
else:
parent.right = None
del node
elif children_count ==1:
if node.left:
n = node.left
else:
n = node.right
if parent:
if parent.left is Node:
parent.left = n
else:
parent.right = n
del node
else:
parent = node
successor = node.right
while successor.left:
parent = successor
successor = successor.left
node.data = successor.data
if parent.left == successor:
parent.left = successor.right
else:
parent.right = successor.right
def print_tree(self):
if self.left:
self.left.print_tree()
print self.data,
if self.right:
self.right.print_tree()
# def compare
if __name__ == "__main__":
root = Node(8)
root.insert(12)
node,parent = root.lookup(8)
print node.data
root.insert(11)
root.delete(11)
root.print_tree()
問題6: 用遞歸方式遍歷二叉樹
前序遍歷(PreorderTraversal,NLR):先訪問根結點,然後遍歷其左右子樹
中序遍歷(InorderTraversal,LNR):先訪問左子樹,然後訪問根節點,再訪問右子樹
後序遍歷(PostorderTraversal,LRN):先訪問左右子樹,再訪問根結點
層序遍歷(levelorderTraversal):按照從上到下的層順序訪問
from collections import namedtuple
from sys import stdout
Node = namedtuple('Node','data,left,right')
tree = Node(1,
Node(2,
Node(4,
Node(7,None,None),
None),
Node(5,None,None)),
Node(3,
Node(6,
Node(8,None,None),
Node(9,None,None)),
None))
def preorder(node):
if node is not None:
print node.data,
preorder(node.left)
preorder(node.right)
def postorder(node):
if node is not None:
postorder(node.left)
postorder(node.right)
print node.data,
def inorder(node):
if node is not None:
inorder(node.left)
print node.data,
inorder(node.right)
def levelorder(node,more=None):
if node is not None:
if more is None:
more = []
more += [node.left,node.right]
print node.data,
if more:
levelorder(more[0],more[1:])
if __name__ =="__main__":
print "preorder:"
preorder(tree)
print "\t\nposteorder:"
postorder(tree)
print "\t\ninorder:"
inorder(tree)
print "\t\nlevelorder:"
levelorder(tree)
問題7:兌換硬幣問題之貪婪算法解決
這是用貪婪算法的典型應用。在本例中用python來實現,主要思想是將貨幣金額除以某硬幣單位,然後去整數,即爲該硬幣的個數;餘數則做爲向下循環計算的貨幣金額。
def change_coin(money):
coin = [1,2,5,10,20,50,100]
coin.sort(reverse=True)
money = money*100
change = {}
for one in coin:
num_coin = money//one
if num_coin>0:
change[one]=num_coin
num_remain = money % one
if num_remain == 0:
break
else:
money = num_remain
return change
if __name__ =="__main__":
money = 5.42
num_coin = change_coin(money)
result = [(key,num_coin[key]) for key in sorted(num_coin.keys())]
print "Total money:%s",money
print "Change:"
print "Coin Num"
print result
for i in result:
if i[0]==100:
print "Yuan %d %d"%(i[0]/100,i[1])
elif i[0]<10:
print "Fen %d %d"%(i[0],i[1])
else:
print "Jiao %d %d"%(i[0]/10,i[1])
問題8:刪除一個字符串中連續超過一次的空格
def del_space(string):
split_string = string.split(" ") ##轉換成列表
string_list = [i for i in split_string if i != ""] ##轉換去掉""元素
result_string = " ".join(string_list) ##重新組成string
return result_string
if __name__ == "__main__":
one_str = "Welcome to S I T!"
string = del_space(one_str)
print one_str
print string