2019 10 10刷題小結

2021-09-28 12:07:36 字數 2230 閱讀 3301

今天的目標三道劍指offer,一道leetcode。完成

1.二維陣列查詢某個數是否存在,陣列是從左到右,從上到下依次增大的,可以從右上角和左下角開始查詢。以右上角為例。

a:首先處理一下特殊情況,獲取一下二維陣列的行數,如果二維陣列為空直接返回false.

b:再獲取列數。從右上角開始查詢的話則當前行為0,當前列為最後一列,迴圈條件就是行不大於最後一行,列不小於第一列。

c:查詢過程。如果當前位置的值等於目標值,直接返回true,如果當前位置的值大於目標值,那麼最後一列不可能存在目標值,所以可以列--,如果當前位置的值小於目標值,那麼第一行不可能存在目標值,所以行++。最後得返回乙個false,對應沒有查詢到目標值的情況。

bool find(int target, vector> array) 

else if(array[curr][curc]>target)

else

}return false;

}

2.替換空格。將字串中的空格替換成%20.

a:首先兩個引數的意義,str是個字元陣列,length是此陣列的最大的容量。

b.統計實際字串的長度和空格的個數,替換之後新的字串的長度等於原始長度+2*空格個數。

c:做兩個特殊情況的判定,乙個是如果字串為空,或者字元陣列的容量小於等於0,二是如果新字串的長度大於陣列的容量,都直接返回空。

d:準備兩個指標,乙個指向新字串的最後一位,乙個指向舊字串的最後一位。如果舊字串的位置不為空,則直接複製給新字串當前位置,否則替換成%20.直到舊字串減為0為止。

void replacespace(char *str,int length) 

int newlength=0;

int spacelength=0;

int strlength=0;

int i=0;

while(str[i]!='\0')

strlength++;

i++;

}newlength=strlength+2*spacelength;

if(newlength>length)

i=newlength;

int j=strlength;

while(j>=0&&i>j)

else

j--;

}}

3.從尾到頭列印鍊錶。

第一種,申請棧。(空間複雜度為o(n))

a:如果棧頭為空直接返回乙個空陣列

b:把鍊錶中的數依次壓入棧中,再彈出壓入陣列裡。

vectorprintlistfromtailtohead(listnode* head) 

listnode* node=head;

while(node)

while(!s.empty())

return res;

}

如果面試不允許申請額外空間,需要先反轉鍊錶,再存入陣列裡,最後記得把鍊錶再反轉回去,最好不要改動原始資料。相當於做兩道題。

leetcode

求給定二叉樹的最小深度。

第一種:遞迴。(dfs)

a:首先判斷根節點是否為空,為空返回0;

b:進入遞迴,計算左子樹的高度,再計算右子樹的高度。

c:左右左右子樹高度是否為0,是的話返回l+r+1,這對應二叉樹只有一邊子樹的情況。

d:最後返回左右子樹最小值+1.

int run(treenode *root)
第二種:非遞迴(bfs),層次遍歷的原理。

a:首先判斷根節點是否為空,為空返回0;

b:結果變數初始化為1。根不為空,壓入乙個佇列中。如果佇列不為空,計算此時佇列的大小(每一層的所有節點數),判斷每個節點的左右兩個孩子是否為空,都為空直接返回結果。如果不是,那麼將改節點壓入佇列。每一層迴圈完之後,結果加一。

c:最後隊列為空後,返回結果值。

int run(treenode *root) 

if(!root->left&&!root->right)

queueque;

que.push(root);

int res=1;

while(!que.empty())

if(node->left)

if(node->right)

}res+=1;

}return res;

}

2019 10 12刷題小結

三道劍指offer,一道leetcode,完成。1.斐波那契數列 num1 1 num2 1 next num2 num1 num1 num2 num2 next int fibonacci int n if n 1 n 2 int pre1 1 int pre2 1 int res 0 for i...

2019 10 15刷題小結

三道劍指offer,一道leetcode,完成。1.合併兩個排序鍊錶。a 如果任何乙個鍊錶為空,那麼返回另乙個煉表頭結點即可。b 申請兩個鍊錶節點變數,乙個用來當做返回的頭結點,乙個用來作為新鍊錶的遍歷。c 最後別忘了把剩下的加到新鍊錶的最後。listnode merge listnode phea...

2019 10 18刷題小結

三道劍指offer一道leetcode。1.陣列中超過一半的數。申請兩個變數,乙個代表當前出現次數最多的數字,乙個代表相對出現的次數。分別初始化為陣列第乙個數和1.如果下乙個數和當前數相同,次數 否則次數 如果次數減為0,那麼就把當前數更新為此時遍歷的數,次數初始化為1.最後再遍歷一遍陣列此時儲存的...