今天的目標三道劍指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.最後再遍歷一遍陣列此時儲存的...