最近在準備一些暑期實習的筆試和面試,在牛客網上面做了一些題,現在整理出來供大家參考,希望和大家共同學習!題目不難,但是要做出來需要考慮時間復雜度、空間復雜的等等,同時還需要一些編程思想;
題目來源:牛客網 *本文所有題目的實現均為java代碼
題目一:二維數組中的查找
描述:
在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
解題思路: 代碼
將target與二維數組array第一行最后一個數做比較,如果target大于該行數,則不考慮第一行,相反不考慮最后一列,相等返回true;
題目二: 替換空格
描述:
請實現一個函數,將一個字符串中的空格替換成“%20”。例如,當字符串為We Are Happy.則經過替換之后的字符串為We%20Are%20Happy。
解題思路: 代碼
- 解法一: 遍歷
- 解法二: 直接使用replaceAll函數
題目三: 從尾到頭打印鏈表
描述:
輸入一個鏈表,從尾到頭打印鏈表每個節點的值。
解題思路: 代碼
- 解法一: 使用棧的方法解決;
- 解法二: 使用遞歸的方法,但是實質還是棧;
題目四: 重建二叉樹
描述
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹并返回;
解題思路: 代碼
- 取前序遍歷第一個數字,該數字是跟節點;
- 在中序遍歷中找到跟節點,則該跟節點左邊是左子數,右邊為右子數;
- 以此遍歷,進行遞歸;
*注:如果這里兩個序列有重復數字又該怎么實現?
題目五: 用棧實現隊列
描述:
用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素為int類型。
解題思路: 代碼
- 將所有數先存入第一個棧中;
- 第一個棧出棧,按照出棧順序存入第二個棧中;
- 再從第二個棧中出棧,即得到隊列;
題目六: 旋轉數組的最小數字
描述:
把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。輸入一個非遞減序列的一個旋轉,輸出旋轉數組的最小元素。例如數組{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該數組的最小值為1;
解題思路: 代碼
*這里如果不旋轉數組直接使用快排找最小數字,依然可以編譯通過;
題目七: 斐波那契數列
描述:
大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項;
解題思路:代碼
- 這里實現的斐波那契數列不使用遞歸的算法,遞歸算法重復計算的次數很多,當輸入n值很大時會出現stackOverflow報錯;
- 所以這里采用的是一個簡單的動態規劃(數組遍歷)
題目八: 跳臺階/ 變態跳臺階
描述:
1, 一只青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
2, 如果青蛙一次可以跳上1級臺階, 2級臺階........ n級臺階. 求該青蛙跳上一個n級臺階總共有多少中跳法.
解題思路: 代碼
1, 遞歸,斐波那契數列
2, 遞歸思路:
- 因為n級臺階,第一步有n種跳法:跳1級、跳2級、到跳n級 * 跳1級,剩下n-1級,則剩下跳法是f(n-1)
- 跳2級,剩下n-2級,則剩下跳法是f(n-2) * 所以f(n)=f(n-1)+f(n-2)+...+f(1)
- 因為f(n-1)=f(n-2)+f(n-3)+...+f(1)
- 所以f(n)=2*f(n-1)
題目八: 矩形覆蓋
描述:
我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?
解題思路:代碼
通過分析,這里依舊時斐波那契數列,不做贅述;
題目九: 二進制中1的個數
描述: 輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼表示。
解題思路: 代碼
- 解法一: 這是一個比較討巧的做法,將二進制轉換為String,同時將0全部用替換為"",然后返回String長度;
- 解法二: 將n與(n-1)相與,會將n最右邊的1去掉;
舉例: n=10 1010&1001=1000 --> 1000&0111=0000; 兩次,即10的二進制數中有兩個1;
題目十: 數值的整數次方
描述:
給定一個double類型的浮點數base和int類型的整數exponent。求base的exponent次方。
解題思路: 代碼
先判斷指數的正負性,然后直接數學思路進行數相乘;
當然也可以直接使用Math.power(base,exponent);
劍指Offer筆試題(2)
以上代碼全部托管在 Github