劍指offer題解

2021-08-15 19:07:40 字數 2904 閱讀 4747

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

思路:這題較好的思路有兩個,乙個是最容易想到的nlog,枚舉行,二分列。另一種就是從左下角逐步列舉,如果大於目標值就向上走,小於目標值就向右走,這樣每次2選1最多走n步,複雜度o(n),之所以不能從常規的左上,因為左上都是行列遞增的,無法抉擇,左下或者右上行列走勢不同,可以唯一確定路徑

**:

class solution 

}return false;

}};

沒什麼好說的,注意他題目其實讓你把str變成最後的答案。。 也可以從前往後數幾個空格,然後從後往前替換,每個字元都要往後移動2*cnt個位置,cnt是這個字元前面的空格數。

void replacespace(char *str,int length)

乙隻青蛙一次可以跳上1級台階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上乙個n級的台階總共有多少種跳法。

原來只能跳1個2個其實就是個簡單dp遞推式,這個思路還蠻多的

思路1:一眼dp優化,字首優化下就好了

思路2:每個台階都有跳與不跳兩種情況(除了最後乙個台階),最後乙個台階必須跳。所以共用2^(n-1)中情況

思路3: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)

**:

int jumpfloorii(int number) 

return dp[number];

}

我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋乙個2*n的大矩形,總共有多少種方法?

思路:一看這道題讓我想到了當年做匹配問題的時候233  畫圖看看,發現這個跟青蛙只能跳1,2個格仔題目一樣,dp[i]代表i之前有多少種放法,你要麼豎著放,佔一列,要麼橫著放佔兩列(放兩個) 轉移方程一目了然

int rectcover(int number)
給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。

思路:面試題可能不會考你各種演算法,演算法的變形,都會考你細節,考一些坑,比如這個。。。沒告訴你ex的正負號。。你要自己去分類,剩下的就是快速冪了

double power(double base, int exponent) 

return exponent < 0 ? 1/ans : ans;

}

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

思路:也算是乙個經典題了,最後記得跑一下全部看看他是不是超過了一半,因為最後剩下的不是眾數,就是最後的數

public:

int morethanhalfnum_solution(vectornumbers)

}for(int i = 0; i < len; i++)

return maxx > len/2 ? res : 0;

}

hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:,連續子向量的最大和為8(從第0個開始,到第3個為止)。你會不會被他忽悠住?(子向量的長度至少是1)

思路:經典的最大連續欄位和

int findgreatestsumofsubarray(vectorarray) 

return maxx;

}

把只包含因子2、3和5的數稱作醜數(ugly number)。例如6、8都是醜數,但14不是,因為它包含因子7。 習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。

思路:醜數肯定是醜數*醜數來的,第乙個是1,那麼我們肯定從1*2,1*3,1*5找乙個最小的,是2,那麼已經確定好順序的醜數有1,2,這時候應該找2*2,1*3,1*5哪個最小了,可以發現2不會再跟1乘一遍了,所以要有3個變數記錄之前哪個醜數分別被2,3,5乘過就好了

int getuglynumber_solution(int index) 

return a[index];

}

用兩個棧來實現乙個佇列,完成佇列的push和pop操作。 佇列中的元素為int型別。

思路:討論區乙個大神講的很清楚了

用兩個棧實現乙個佇列的功能?要求給出演算法和思路!

《分析》:

入隊:將元素進棧a

出隊:判斷棧b是否為空,如果為空,則將棧a中所有元素pop,並push進棧b,棧b出棧;

如果不為空,棧b直接出棧。

用兩個佇列實現乙個棧的功能?要求給出演算法和思路!

《分析》:

入棧:將元素進佇列a

出棧:判斷佇列a中元素的個數是否為1,如果等於1,則出佇列,否則將佇列a中的元素

以此出佇列並放入佇列b,直到佇列a中的元素留下乙個,然後佇列a出佇列,再把

佇列b中的元素出佇列以此放入佇列a中。

class solution

int pop()

}int t = stack2.top();

stack2.pop();

return t;

}private:

stackstack1;

stackstack2;

};

劍指Offer題解索引

陣列中重複的數字 二維陣列中的查詢 構建乘積陣列 替換空格 字元流中第乙個不重複的字元 表示數值的字串 斐波那契數列 跳台階 跳台階 矩形覆蓋 從尾到頭列印鍊錶 刪除鍊錶中重複的結點 鍊錶中環的入口結點 把二叉樹列印成多行 按之字形順序列印二叉樹 對稱的二叉樹 二叉樹的下乙個結點 資料流中的中位數 ...

劍指offer部分題解(1)

題目描述 輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這三個數字能排成的最小數字為321323。思路 注意點class solution string printminnumber vector int numbers sort ...

劍指offer題解(十) C java

輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。假設輸入的陣列的任意兩個數字都互不相同。例如,下圖是後序遍歷序列 3,1,2 所對應的二叉搜尋樹。bst的後序序列的合法序列是,對於乙個序列s,最後乙個元素是x 也就是根 如果去掉最後乙個元素的序列為t,那麼t滿足 t可以分成兩段,前一...