1. 程式人生 > >python+演算法+資料結構+面試題

python+演算法+資料結構+面試題

一、單鏈表反轉

#!/usr/bin/python
#遞迴實現單鏈表反轉

class ListNode(object):
  def __init__(self,x):
    self.val=x
    self.next=None


def recurse(head,newhead):  #遞迴,head為原連結串列的頭結點,newhead為反轉後連結串列的頭結點
  if head is None:
    return
  if head.next is None:
    newhead=head
  else :
    newhead=recurse(head.next,newhead)
    head.next.next=head
    head.next=None
  return newhead



if __name__ == '__main__':
    head=ListNode(1)       #測試程式碼
    p1=ListNode(2)       # 建立連結串列1->2->3->4->None
    p2=ListNode(3)
    p3=ListNode(4)
    head.next=p1
    p1.next=p2
    p2.next=p3
    newhead=None
    p=recurse(head,newhead)    #輸出連結串列4->3->2->1->None
    while p:
      print(p.val)
      p=p.next

二、字串倒序

#寫一個函式, 輸入一個字串, 返回倒序排列的結果
#1).利用字串本身的翻轉

str = 'abcdef'
# def string_reverse(string):
#     return string[::-1]
#
# if __name__ =="__main__":
#     print(str)
#     print(string_reverse(str))

#2).把字串變成列表,用列表的reverse函式
# def string_reverse2(string):
#     new_str = list(string)
#     new_str.reverse()
#     return ''.join(new_str)
# if __name__ =="__main__":
#     print(str)
#     print(string_reverse2(str))


#3).新建一個列表,從後往前取
# def string_reverse3(string):
#     new_str = []
#     for i in range(1,len(string)+1):
#         new_str.append(string[-i])
#
#     return ''.join(new_str)
#
# if __name__ =="__main__":
#     print(str)
#     print(string_reverse3(str))

#4).利用雙向列表deque中的extendleft函式
# from collections import deque
#
# def string_reverse4(string):
#     d = deque()
#     d.extendleft(string)
#     return ''.join(d)
#
# if __name__ =="__main__":
#     print(str)
#     print(string_reverse4(str))

#5).遞迴
# def string_reverse5(string):
#     if len(string)<=1:
#         return string
#     else:
#         return string_reverse5(string[1:])+string[0]
#
# if __name__ =="__main__":
#     print(str)
#     print(string_reverse5(str))

三、list去重

# 1.按升序合併如下兩個list, 並去除重複的元素
list1 = [2, 3, 8, 4, 9, 5, 6]

list2 = [5, 6, 10, 17, 11, 2]

list3 = list1 + list2

sort_list = sorted(list(set(list3)))

print(sort_list)

四、排序

1.氣泡排序

時間複雜度:O(n2)
#coding:utf-8
#!/usr/bin/python

def bubble_sort(list):
    for i in range(len(list)-1):
        for j in range(len(list)-i-1):
            if list[j]>list[j+1]:
                list[j],list[j+1] = list[j+1],list[j]
    return list

if __name__ == '__main__':
    list = [2,3,5,19,3,5,6,7]
    print(bubble_sort(list))

2.快速排序

時間複雜度:O(nlogn)

版本一:

#!/usr/bin/python3
#-*- coding:utf-8 -*-

def sub_sort(lists,low,high):
    key = lists[low]
    while low < high:
        while low < high and lists[high] >= key:
            high -= 1
            lists[low] = lists[high]
            print("===========")
            print("low=")
            print(low)
            print("high=")
            print(high)
            print(lists)
        while low < high and lists[high] < key:

            low += 1
            lists[high] = lists[low]
            print("===========")
            print("low=")
            print(low)
            print("high=")
            print(high)
            print(lists)
    lists[low] = key
    return low

def quick_sort(array, low, high):
    if low < high:
        key_index = sub_sort(array,low,high)
        #遞迴進行排序
        quick_sort(array, low, key_index)
        quick_sort(array, key_index+1, high)


if __name__ == "__main__":
    lists = [3, 5, 4, 2, 1, 6]
    print(lists)
    quick_sort(lists, 0, 5)

版本二(自己寫):

# coding:utf-8
# /usr/bin/python
import time
import sys

def calc_time(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(start_time)
        print(end_time)
        print("%s waster time is %s"%(func.__name__, end_time - start_time))
        return result
    return wrapper



def quick_sort(data, left, right):
    if left < right:
        mid = partition(data, left, right)
        quick_sort(data, left, mid - 1)
        quick_sort(data, mid + 1, right)


def partition(data, left, right):
    tmp = data[left]
    while left < right:
        while left < right and data[right] >= tmp:
            right -= 1
        data[left] = data[right]

        while left < right and data[left] <= tmp:
            left += 1
        data[right] = data[left]
    data[left] = tmp
    return left

@calc_time
def quick_sort_x(data):
    return quick_sort(data, 0, len(data) - 1)


if __name__ == '__main__':
    sys.setrecursionlimit(10000)
    lists = list(range(1000))
    #print(lists)
    quick_sort_x(lists)
    #print(lists)

相關推薦

python+演算法+資料結構+試題

一、單鏈表反轉 #!/usr/bin/python #遞迴實現單鏈表反轉 class ListNode(object): def __init__(self,x): self.val=x self.next=None def recurse(hea

資料結構試題oj練習

題        oj 連結:https://leetcode-cn.com/problems/remove-linked-list-elements/description/ /** * Definition for singly-lin

Java 程式設計師必須掌握的 8 道資料結構試題,你會幾道

瑞士電腦科學家Niklaus Wirth在1976年寫了一本書,名為《演算法+資料結構=程式設計》。 40多年後,這個等式仍被奉為真理。這就是為什麼在面試過程中,需要考察軟體工程師對資料結構的理解。 幾乎所有的問題都需要面試者對資料結構有深刻的理解。無論你是初入職場的

資料結構試題(含答案)

1.棧和佇列的共同特點是(只允許在端點處插入和刪除元素) 4.棧通常採用的兩種儲存結構是(線性儲存結構和連結串列儲存結構) 5.下列關於棧的敘述正確的是(D)      A.棧是非線性結構B.棧是一種樹狀結構C.棧具有先進先出的特徵D.棧有後進先出的特徵 6.連結串列不具有的特點是(B)A.不必事先估計儲存

資料結構試題/判斷一棵樹是否是完全二叉樹

二叉樹: 1.滿二叉樹:在一棵二叉樹中,如果所有分支節點都存在左子樹和右子樹,並且所有葉子節點都在同一層上。 2.完全二叉樹:如果一棵具有N個結點的二叉樹的結構與滿二叉樹的前N個結點的結構相同,稱為完全二叉樹。 //判斷一棵二叉樹是否是完全二叉樹--利

資料結構試題總結1——陣列:求最大、次大值

一般大家一開始想到的辦法就是一次迴圈,記錄下最大值和最小值。或者就是用兩次冒泡,找到最大值和次大值。 這兩種方法實踐複雜度差不多都是O(2n),如果陣列很長,效率還是不夠高的。 注意:直接排序,再選擇最大的兩個值,這並不是一個好辦法,因為我們只需要前兩個數有序,不需要後N-

資料結構試題總結5——陣列:找出陣列中唯一一個出現一次的元素

問題描述:一個數組其中有一個元素出現了一次(奇次),其他元素都出現兩次(偶數次數),找出出現一次(奇次)的元素。 分析:碰到這種偶次奇次的問題,首先要想一下位運算中的異或。一個數異或本身為0,一個數異或0不變。a ^ a = 0, a ^ 0 = a。 這個題中,我們可以把

資料結構試題總結2——陣列:求出現次數超過一半的元素

遇到這個題最簡單的想法就是,統計每個元素出現的次數。但是無法知道陣列中有多少種元素,並且這樣會用到其他的儲存空間,再查詢結果的時候也需要多遍歷一次結果的陣列。 正確的解決辦法是去記錄重複元素(不管是否是結果元素)的數量,然後碰見一個不同元素就減一(相當於抵消了),碰見結果元

Java常見資料結構試題(帶答案)

1.棧和佇列的共同特點是(只允許在端點處插入和刪除元素)4.棧通常採用的兩種儲存結構是(線性儲存結構和連結串列儲存結構)5.下列關於棧的敘述正確的是(D)     A.棧是非線性結構B.棧是一種樹狀結構C.棧具有先進先出的特徵D.棧有後進先出的特徵6.連結串列不具有的特點是(

資料結構試題總結6——陣列:求兩個陣列中滿足給定和的兩個元素

問題描述:在兩個有序陣列中,分別找出a,b兩個元素滿足a+b = c,c已知。 分析:我們要用有序這個有利條件,避免迴圈中套迴圈。我們用兩個索引i,j分別指向陣列A,B的首尾,根據比較的結果來移動索引的位置。 如果     A[i] + B[j]  <  c , i+

Java資料結構試題

1.棧和佇列的共同特點是(只允許在端點處插入和刪除元素) 4.棧通常採用的兩種儲存結構是(線性儲存結構和連結串列儲存結構) 5.下列關於棧的敘述正確的是(D)      A.棧是非線性結構B.棧是一種樹狀結構C.棧具有先進先出的特徵D.棧有後進先出的特徵 6.連結串列不具有的

資料結構演算法-----常問試題

資料結構 陣列 尋找陣列中第二小的元素 找到陣列中第一個不重複出現的整數 合併兩個有序陣列 重新排列陣列中的正值和負值 棧 使用棧計算字尾表示式 對棧的元素進行排序 判斷表示式是否括號平衡 佇列 使用隊列表示棧 對佇列的前k個元素倒序 使用佇列生成從1到n

python試題——python常見資料結構

                              python面試題——python常見資料結構 文章開始把我喜歡的這句話送個大家:這個

強烈推薦一本免費演算法書《用Python解決資料結構演算法問題》

學 Python 僅僅只學 Python 語法和 API 是遠遠不夠的,掌握演算法和資料結構這種永遠都不會過時的核心技能才是決定一個程式設計師職業發展的關鍵因素。演算法和資料結構對專業程式設計師來說重要性不言而喻,同樣一個問題,不同演算法效率可謂千差萬別。在問題規模很小的時候你可能感知不到,

python資料分析師試題

以下題目均非原創,只是彙總 python資料分析部分 1. 如何利用SciKit包訓練一個簡單的線性迴歸模型 利用linear_model.LinearRegression()函式  # Create linear regression object regr = linear_model.LinearR

Python版本的資料結構書_《用Python解決資料結構演算法問題》

源於經典 資料結構作為計算機從業人員的必備基礎,Java, c 之類的語言有很多這方面的書籍,Python 相對較少, 其中比較著名的一本 problem-solving-with-algorithms-and-data-structure-using-pyt

開源一個 Python 中文資料結構演算法教程

課程簡介資料結構和演算法是每個程式設計師需要掌握的基礎知識之一,也是面試中跨不過的檻。目前關於 Python 演算法和資料結構的中文資料比較欠缺,筆者嘗試錄製視訊教程幫助 Python 初學者掌握常用演算法和資料結構,提升開發技能。本教程是付費教程(文字內容和程式碼免費),因

算法和數據結構試題

printf sso 標點符號 子數組 names 開始 負數 con 那是 1.求子數組的最大和 例如輸入的數組為1, -2, 3, 10, -4, 7, 2, -5,和最大的子數組為3, 10, -4, 7, 2,因此輸出為該子數組的和18。 因為是O(N)的復雜度,因

python資料結構------列表

一、數字的處理函式 (一)int() 取整數部分,與正負號無關,舉例如下: 1 print(int(-3.6), int(-2.5), int(-1.4)) 2 print(int(3.6), int(2.5), int(1.4))執行結果如下:  -3 -2 -1 3 2 1 (二)/

python資料結構---字典

一、描述 由鍵值key-value組成的資料的集合 可變、無序的,key不可以重複 字典的鍵key要可hash(列表、字典、集合不可雜湊),不可變的資料結構是可雜湊的(字串、元組、物件、bytes) 字典的值value可以是任意的資料型別 二、字典的相關操作 1、訪問字典的值val