Python算法練習

問題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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章