劍指offer66題(Python) 第一天

2021-08-20 02:28:38 字數 4485 閱讀 1017

在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。

請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。

思路:從左下角元素往上查詢,右邊元素是比這個元素大,上邊是的元素比這個元素小。於是,target比這個元素小就往上找,比這個元素大就往右找。如果出了邊界,則說明二維陣列中不存在target元素。

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

class solution:

# array 二維列表

def find(self, target, array):

# write code here

rows = len(array) - 1

cols= len(array[0]) - 1

i = rows

j = 0

while j<=cols and i>=0:

if targetarray[i][j]:

j += 1

else:

return true

return false

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

class solution:

# array 二維列表

def find(self, target,array):

if array == :

return false

nrow = len(array)

ncol = len(array[0])

if target < array[0][0] or target > array[nrow-1][ncol-1]:

return false

else:

for i in range(nrow):

for j in range(ncol):

if target == array[i][j]:

return true

else:

return false

a = solution()

a.find(7,[[1, 2, 8, 9], [2, 4, 9, 12], [4, 7, 10, 13], [6, 8, 11, 15]])

思路:從前向後記錄『 』數目,從後向前替換『 』。

class solution 

else}}

};

其實,replace()一句話就可以搞定啊( return s.replace(' ','%20')),但是這樣怎麼能體現我們的逆向思維以及對字串的掌握能力呢?所以,必須要展示我們的分析能力嘛。

輸入乙個鍊錶,從尾到頭列印鍊錶每個節點的值。

思路: 可以使用棧或者遞迴的方式實現。

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

class listnode:

def __init__(self, x):

self.val = x

self.next = none

class solution:  

# 返回從尾部到頭部的列表值序列,例如[1,2,3]  

def printlistfromtailtohead(self, listnode):  

# write code here  

out =   

if listnode is none:  

return out  

while listnode.next is not none:  

listnode = listnode.next  

out.reverse()  

return out

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

思路:採用遞迴實現,需要判斷前序遍歷和中序遍歷中左子樹和右子樹的結點的個數和位置。pre[0]為根節點。

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

# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class solution:

# 返回構造的treenode根節點

def reconstructbinarytree(self, pre, tin):

# write code here

if len(pre) == 0:

return none

if len(pre) == 1:

return treenode(pre[0])

else:

flag = treenode(pre[0])

flag.left = self.reconstructbinarytree(pre[1:tin.index(pre[0])+1],tin[:tin.index(pre[0])])

flag.right = self.reconstructbinarytree(pre[tin.index(pre[0])+1:],tin[tin.index(pre[0])+1:] )

return flag

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

思路:

# -*- 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 self.stack2==:

while self.stack1:

return self.stack2.pop()

return self.stack2.pop()

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

思路:(

思路不代表**的實現

)採用二分法解答這個問題,

mid = low + (high - low)/2

需要考慮三種情況:

(1)array[mid] > array[high]:

出現這種情況的array類似[3,4,5,6,0,1,2],此時最小數字一定在mid的右邊。

low = mid + 1

(2)array[mid] == array[high]:

出現這種情況的array類似 [1,0,1,1,1] 或者[1,1,1,0,1],此時最小數字不好判斷在mid左邊

還是右邊,這時只好乙個乙個試 ,

high = high - 1

(3)array[mid] < array[high]:

出現這種情況的array類似[2,2,3,4,5,6,6],此時最小數字一定就是array[mid]或者在mid的左

邊。因為右邊必然都是遞增的。

high = mid

注意這裡有個坑:如果待查詢的範圍最後只剩兩個數,那麼mid

一定會指向下標靠前的數字

比如 array = [4,6]

array[low] = 4 ;array[mid] = 4 ; array[high] = 6 ;

如果high = mid - 1,就會產生錯誤, 因此high = mid

但情形(1)中low = mid + 1就不會錯誤

牛客網 劍指Offer(66題)

1 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。方法一 直接遍歷二維陣列 public class solution find 8,a public st...

劍指Offer66題的總結 目錄

劍指offer每日6題系列終於在今天全部完成了,從2017年12月27日到2018年2月27日,歷時兩個月的寫作,其中絕大部分的時間不是花在做題上,而是花在寫作上,這個系列不適合大神,大牛,這個系列是我專門為那些初識演算法,資料結構的同學和對基礎演算法,基本資料結構不熟練的同學而寫的。裡面所有的博文...

劍指offer 66題 part1(1 6題)

在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數 這個題其實很簡單 左上角是最小的,右下角是最大的,如果我們從最大或者最小的地方開始查詢不是很方便,想一想是不是,因為有時候選擇是不確定...