《劍指offer》筆記 第5章(2)

2021-08-07 04:53:57 字數 2477 閱讀 9380

面試題42:連續子陣列的最大和

輸入乙個整型陣列,陣列裡有正數也有負數。陣列中乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度是o(n)。例如,陣列為,和最大的子陣列為,輸出位18。

測試用例:

功能測試:陣列中有正數也有負數;陣列中只有正數;陣列中只有負數;

特殊輸入:陣列為null;

分析:

分析累加子陣列的規律:

1.維護兩個值,當前累加的子陣列和ncursum、最大的子陣列和ngreatestsum,初始化為0; 2.

第一步加1,ncursum為1,ngreatestsum為1; 3.

第二步加-2,ncursum為-1,ngreatestsum為1; 4.

第三步應加上3,但此時ncursum<=0,說明如果相加,得到的結果比當前的數字還要小,說明從第一步開始累加小於從第三步開始累加,則拋棄之前的累加,ncursum為3,ngreatestsum為3; 5.

第四步加10,ncursum為13,ngreatestsum為13; 6.

第五步加-4,ncursum為9,ngreatestsum為13;儲存之前的13是因為這有可能是最大的子陣列和; 7.

第六步加7,ncursum為16,ngreatestsum為16; 8.

第七步加2,ncumsum為18,ngreatestsum為18; 9.

第八步加-5,ncursum為13,ngreatestsum為18;

動態規劃法:

10.f(i)表示以第i個數字結尾的子陣列的最大和。函式要求出的是max[f(i)]。

11.當i= 0或者f(i-1)<=0時f(i) = pdata[i];

12.當i!=0並且f(i-1)>0時,f(i) = f(i-1) + pdata[i]

13.f(i)對應上一方法的ncursum,max[f(i)]對應上一方法的ngreatestsum;

處理無效輸入:

14.輸入陣列是null、陣列長度小於等於0,返回0,並且定義乙個全域性變數標記輸入無效(定義全域性變數是為了區別無效返回0和最大值是0)

面試題43:1~n整數中1出現的次數

輸入乙個整數n,求1~n這n個整數的十進位制表示中,1出現的次數。例如輸入12,1至12的整數中,包含1的有1/10/11/12,1一共出現5次。

測試用例:

功能測試:輸入0/1(邊界);輸入其他整數;

效能測試:輸入較大的數字10000等:

分析:

1.得到每位數字的方法是:迴圈對10求餘,除以10替換原數,直到原數等於0; 2.

從1到n,對每乙個數字,判斷每一位數字是否是1,累加1的個數;對於數字n,n有o(logn)位,判斷每一位是否是1的複雜度是o(logn),那麼演算法複雜度是o(nlogn),效率不高;

分析數字規律:

3.例如1~21345,分成兩段,一段是1~1345,一段是1346~21345; 4.

對於1346~21345,1出現在最高位是10000~19999,一共10000次,如果最高位是1即1~11345,則最高位1出現是10000~11345,出現次數是1345+1; 5.

對於1346~21345,分析1出現其他位的情況,由於最高位是2,拆分為1346~11345和11346~21345;每一段後4位數字,選擇其中一位是1,其餘3位可在0~9任意選擇,排列組合一共出現的次數是2*4*1000=8000。 6.

對於1~1345,可用步驟3/4/5的方法,遞迴求出; 7.

每次去掉最高位進行遞迴,遞迴的次數和位數相同。n有o(logn)位,複雜度是o(logn);

面試題44:數字序列中的某一位的數字

數字以0123456789101112131415……的格式序列化到乙個字串行中。寫乙個函式,求出任意第n位對應的數字(從第0位開始計數)。

測試用例:

邊界測試:輸入0/1;

功能測試:輸入其他整數;

分析:

1.例如,輸入1001,即求序列0123456789101112……的第1001位的數字; 2.

0~9這10個數字,是前10位;10~99這90個數字接下來的2*90=180位;100~999這900個數字,是接下來的3*900=2700位; 3.

1001位在三位數中的乙個數中:1001>10,說明在一位數之後;1001-10=991>90,說明在兩位數之後;1001-10-180=811<2700,說明在三位數中的乙個;811=3*270+1,說明位於第270個三位數之後的乙個數的中間位,即370的中間位即7。(100是第乙個三位數,101是第二個三位數,100+270=370是第270+1個三位數)

《劍指offer》筆記 第5章(5)

面試題50 第乙個只出現一次的字元 題目一 實現函式,找出字串中第乙個只出現一次的字元,如 abaccdeff 輸出b 測試用例 功能測試 字串所有字元都出現多次 字串中所有字元都出現一次 字串中存在只出現一次的字元 特殊輸入 字串為null 分析 1.從頭掃瞄字元,拿到乙個字元後,與其後面的字元比...

《劍指offer》 第2章(2)

2.3.5 棧和佇列 棧 後進先出,不考慮排序的資料結構,要找到最大最小元素需要o n 時間,若要在o 1 時間內找到最大最小值,需要對棧做特殊的設計。面試題9 用兩個棧實現佇列 測試用例 1.往空佇列裡新增元素 刪除元素 2.往非空佇列裡新增元素 刪除元素 3.連續刪除元素直到隊列為空 思路 1....

劍指offer 讀書筆記 第2章

感覺自己的 能力還在很弱,所以又第二遍仔細的閱讀劍指offer了 第二章 面試需要的基礎知識 所謂賦值運算函式就是對 這個操作符進行過載,從而使等號能夠直接用於兩個例項之間的賦值。這個c 課上學過,不過現在忘完了,只記得學過。需要考慮的點 返回值的型別宣告為該型別的引用,在函式結束前返回例項自身的引...