《劍指offer》刷題打卡第1天

2021-09-13 17:32:29 字數 1953 閱讀 3306

面試題1:二維陣列中的查詢

題目:在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。

演算法思想:

第一步:選取陣列右上角的數字9,將7與9作比較,9>7,又因為9是第四列中最小的乙個數,故可做出判斷,7絕對不會出現在第四列,所以排除第四列。

第二步:選取第三列中右上角的數字8,8>7,同理,排除第三列。

第三步:選取第二列中右上角的數字2,因為2<7,故要查詢的數字7有可能位於2的右或2的下邊,因為2的右邊已經被排除,故只能往2的下邊查詢,所以可以排除2所在的行。

第四步:選取第二行第二列數字4,因為4<7,所以同理,排除第二行。

第五步:選取第三行第二列的數字7,因為7=7,故結束查詢。

總結規律:

首先選取陣列中右上角的數字。如果該數字等於要查詢的數字,則查詢過程結束;如果該數字大於要查詢的數字,則剔除這個數字所在的列;如果該數字小於要查詢的數字,則剔除這個數字所在的行。

c++實現:

class solution 

return false;

}

};

演算法思想:

有兩種方法:

法一:如果是在原來的字串上進行替換,就有可能覆蓋修改在該字串後面的記憶體。

法二:如果是建立新的字串並在新的字串上進行替換,那麼我們可以自己分配足夠多的記憶體。

假設面試官讓我們在原來的字串上進行替換,並且保證輸入的字串後面有足夠多的記憶體。

解法一:時間複雜度為o(n^2)

從前向後替換:

首先從頭到尾掃瞄字串,每次碰到空格字元的時候進行替換。由於是把1個字元替換成3個字元,我們必須要把空格後面所有的字元都後移2個位元組,否則就有兩個字元被覆蓋

此方法時間複雜度太大,效率太低。

解法2:時間複雜度為o(n)

從後向前替換

第1步:首先遍歷一次字串,統計出字串中空格的總數;

第2步:每替換乙個空格,長度增加2,因此替換以後的時間長度等於原來的長度加上2乘以空格數。

第3步:從字串的後面開始複製和替換。首先準備兩個指標:p1和p2,p1指向原始字串的末尾,而p2指向替換之後的字串的末尾。

第4步:向前移動p1,逐個把它指向的字元複製到p2指向的位置,直到碰到第乙個空格為止。

c++實現:

class solution 

/*newlength 為把空格替換成20%之後的長度*/

int newlength = originallength + numberofblank * 2;//空格替換後的總長度

if(newlength > length)//若替換後的總長度大於分配的長度,則直接返回。

return;

//類似於定義兩個指標,第乙個指標p1,指向字串的末尾,第二個指標p2,指向替換後的字串末尾

int indexoforiginal = originallength;//原始長度,第乙個指標p1

int indexofnew = newlength;//替換後的長度,第二個指標p2

while(indexoforiginal >= 0 && indexofnew > indexoforiginal)

else

-- indexoforiginal;//每進行一次指標p1向前移動一格

} }};

劍指Offer 第1題

問題 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。暴力法 分析 直接遍歷一遍陣列,即可判斷目標target是否存在。複雜度分析 時間複雜度 o n 2 因...

劍指offer刷題

面試題6 從尾到頭列印鍊錶 struct listnode class solution reverse res.begin res.end return res 替換空格class solution int newnumstr numstr numspace 2 if newnumstr leng...

劍指offer刷題

原題鏈結 動態規劃 class solution dp for int i 1 i len1 i else if p j 1 else return dp len1 len2 原題鏈結 數學推導 找規律 class solution else if n 3 2 return ipow 3 numso...