第一題:在乙個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。
分析:因為這是乙個有序的二維陣列,且從左至右遞增,從上至下遞增,經過畫圖就會發現,再這個二維陣列中有兩個特殊的位置,左下角和右上角,這兩個位置和其他地方不同,只有兩條路徑,分析起來更為簡單,且兩條路徑的增長方向相反,更易比較
分析:
法一:首先考慮的是插入這個字串後,原字串的字元下標全部都會改變,如果用從前往後遍歷,用頭插的話效率太低,所以用尾插,相當於先將後路鋪好再來解決問題。
class solution
for(int i = length-1; i >= 0; --i)
else
}}};
法二:呼叫string類的方法,直接可以完成這種操作(不過有時候編譯可能不通過,也有點像作弊的感覺)
class solution
auto ret = s.c_str();
strcpy(str, ret);
}};
第三題:輸入乙個鍊錶,按煉錶值從尾到頭的順序返回乙個arraylist。
分析:法一:先入棧在出棧就歐克
class solution
while(!reverse.empty())
return result;}};
法二:反向迭代器列印
class solution
return (vector(result.rbegin(), result.rend()));}};
第四題:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。
分析:重建二叉樹,必須要中序遍歷的結果,先找到根節點,前序第乙個元素就是根節點,然後在通過根節點找到中序遍歷中根節點的位置,中序中根節點的左邊的就是根節點的左子樹,右邊就是右子樹,用歸併排序即可重建二叉樹
class solution
treenode* head = new treenode(pre[0]);
vectorleft_pre, left_vin, right_pre, right_vin;
int key = 0;
for(int i = 0; i < vinlen; ++i)
for(int i = 0; i < key; ++i)
for(int i = key+1; i < vinlen; ++i)
head->left = reconstructbinarytree(left_pre, left_vin);
head->right = reconstructbinarytree(right_pre, right_vin);
return head;}};
第五題:用兩個棧來實現乙個佇列,完成佇列的push和pop操作。 佇列中的元素為int型別
分析:1.入棧:先判斷b棧有沒有資料,如果有資料,需要先出棧,因為必須保證b棧是空棧,然後再讓a棧入棧;
2.出棧:先判斷a棧有沒有資料,如果有資料,需要先出棧,將資料全部壓入b棧中,然後再讓b棧出棧。
class solution
stack1.push(node);
}int pop()
int result = stack2.top();
stack2.pop();
return result;
}private:
stackstack1;
stackstack2;
};
劍指offer真題11 15
11題 輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示 法一 讓n減去1,我們發現,在讓他和原來的n按位與之後,n中的1會減少乙個,依次迴圈下去,就可以累計出1的個數,且這個方式不用擔心負數的問題 class solution return count 法二 定義乙個flag為1,...
劍指offer刷題 15
面試題29 順時針列印矩陣 輸入乙個矩陣,按照從外向裡以順時針的順序依次列印出每乙個數字。void printmatrixcloockwisely int numbers,int columns,int rows void printmatrixincircle int numbers,int co...
劍指offer 題15(反轉鍊錶)
反轉鍊錶 輸入乙個鍊錶,反轉鍊錶後,輸出新鍊錶的表頭。coding utf 8 class listnode def init self,x self.val x self.next none class solution 返回listnode defreverselist self,phead w...