劍指 offer 刷題記錄

2021-09-25 02:52:33 字數 3905 閱讀 5766

任誰都躲不過找工作的問題,好希望能多準備一些時間,奈何時間不等人,每天刷幾道題,並且記錄下來吧:

def replacespace(s):

# write code here

num_space = 0

new_s = ''

for i in range(len(s)):

if i == ' ':

num_space += 1

for i in range(len(s)):

if s[i] == ' ':

new_s = new_s + '%20'

else:

new_s = new_s + s[i]

return new_s

a = ' ii oob '

replacespace(a)

開闢了另外的空間,空間複雜度有點高,但看起來思路很簡單。還有一種做法是首先確定整個字串的長度,然後不斷的插入,並將後邊的字串向後推。

二、 輸入乙個鍊錶,按煉錶值從尾到頭的順序返回乙個arraylist。

class listnode:

def __init__(self, val=none):

self.val = val

self.next = none

def printlistfromtailtohead(listnode):

result =

head = listnode

while head:

result.insert(0,head.val)

head = head.next

return result

e1 = listnode(1)

e2 = listnode(2)

e3 = listnode(3)

e4 = listnode(5)

e1.next = e2

e2.next = e3

e3.next = e4

print(e1.next)

printlistfromtailtohead(e1)

首先,我們的定義鍊錶節點類,節點內只有兩個資訊,乙個是該節點的值,另外乙個是節點的下乙個節點。

開闢乙個新空間就乙個列表,在這個列表的列表頭 index = 0 處,不斷的插入鍊錶的值即可

三、 重建二叉樹:

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。

利用前序遍歷和中序遍歷之間的關係,使用遞迴的方式求解:

# 重建二叉樹

# 利用 二叉樹的前序遍歷 中序遍歷 重建二叉樹

# 前序遍歷的順序為先根節點再左再右 中序遍歷的順序為先左節點再中再右

# -*- coding:utf-8 -*-

class treenode:

def __init__(self, x):

self.val = x

self.left = none

self.right = none

class solution:

def reconstructbinarytree(self, pre, tin):

# write code here

if len(pre) == 0:

return none

elif len(pre) == 1:

return treenode(pre[0])

else:

root = treenode(pre[0])

position = tin.index(pre[0])

root.left = self.reconstructbinarytree(pre[1:position+1], tin[:position])

root.right = self.reconstructbinarytree(pre[position+1:], tin[position+1:])

return root

四、 用兩個棧來實現乙個佇列,完成佇列的push和pop操作。 佇列中的元素為int型別。

# 用兩個棧 實現乙個佇列

# 棧的特性是先入後出 佇列的特性是先入先出

# 所以需要用兩個棧 其中乙個負責壓棧設為棧1 另外乙個負責彈棧設為棧2

# 當壓棧時,將元素壓入棧1, 當彈棧時 如果棧2為空,就將棧1的內容彈入棧2 , 此時佇列的頭在棧頂, 將其彈出即可

# 當棧2不為空時,則先彈出棧2的內容,直到其為空

# -*- coding:utf-8 -*-

class solution:

def __init__(self):

self.stack1 =

self.stack2 =

def push(self, node):

# write code here

def pop(self):

# return xx

if len(self.stack2) == 0:

while self.stack1:

return self.stack2.pop()

五、 旋轉陣列

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。 例如陣列為的乙個旋轉,該陣列的最小值為1。 note:給出的所有元素都大於0,若陣列大小為0,請返回0。

為了降低時間複雜度,這裡一定要使用旋轉陣列的性質,旋轉陣列有兩個分離的陣列構成,而且後邊的小於、等於前邊的。所以這裡的方法就是,二分法,不斷將陣列二分,如果中位點大於左邊的點,就將中位點設為左,否則設為右,遞迴的將問題分解成小問題,邊界條件是  right - left ==1。

# 找旋轉陣列 最小值

# 為了降低時間複雜度 需要利用旋轉陣列的性質

def minnumberinrotatearray(rotatearray):

# write code here

if len(rotatearray) == 0:

return 0

left = 0

mid = 0

right = len(rotatearray) - 1

while rotatearray[left] >= rotatearray[right]:

if (right-left) == 1:

mid = right

break

if rotatearray[left] == rotatearray[mid] and rotatearray[mid] == rotatearray[right]:

return mininside(rotatearray,left ,right)

if rotatearray[left] >= rotatearray[right]:

mid = (left + right) // 2

if rotatearray[mid] >= rotatearray[left]:

left = mid

else:

right = mid

return rotatearray[mid]

def mininside(array,left,right):

result = array[left]

for i in range(left,right+1):

if array[i] < result:

result = array[i]

return result

a = [1,0,1,1,1]

b = minnumberinrotatearray(a)

print(b)

劍指offer刷題記錄

遞迴法 鍊錶的後續遍歷,並用self.k來記錄倒數節點的位置,找到了就返回找到的節點,否則返回none coding utf 8 class listnode def init self,x self.val x self.next none class solution def init self...

劍指offer刷題記錄 綜合

將乙個字串轉換成乙個整數,要求不能使用字串轉換整數的庫函式。數值為0或者字串不是乙個合法的數值則返回0 輸入描述 輸入乙個字串,包括數字字母符號,可以為空 輸出描述 如果是合法的數值表達則返回該數字,否則返回0 做這個題目做的真的很煩,最麻煩的就是判斷當前是否越界。可儲存的最大的正數末位為7,可儲存...

Leetcode刷題記錄 劍指offer

面試題3 陣列中重複數字 使用set,時間複雜度o n 空間複雜度o n class solution object deffindrepeatnumber self,nums type nums list int rtype int a set for num in nums if num in ...