劍指offer面試題 一

2021-07-11 16:34:15 字數 1269 閱讀 6692

拿到這樣一道題目,如何去分析呢?我們通過觀察替換前和替換後的字串發現,原本空格的位置被替換成了三個字元%20,如果我們從前往後遇到空格就替換,那仫很容易導致後面的記憶體被覆蓋,那仫如何才能解決這個問題呢?並且這個問題也存在記憶體分配的問題,如果面試官告訴你記憶體足夠大,那仫你就可以盡情的使用記憶體啦。

最費時間的想法就是:找到空格找到後,就將空格後的字元往後移兩個位置,使得%20能夠不覆蓋後面的字元而儲存,如果遇到下乙個空格後繼續重複上面的步驟,但是這種想法不是高效的,我們知道它的思路是先遍歷一遍字串,找到空格後,空格後面的字元向後偏移,這使得這種演算法的時間複雜度不高,為o(n^n),我們就不介紹這種演算法的實現了。在這裡我們提供的是另一種時間複雜度為:o(n)的演算法,效率較高,搞定面試官就靠它啦!

如果我們提前知道空格的數目,並計算出替換之後的字串長度,此時我們只需要用兩個下標,乙個指向舊串的最後乙個字元,乙個指向新開闢空間的末尾,只要遇到的不是空格,我們就將字元原模原樣的賦值給新串,一旦遇到空格就倒序替換(讀者可以自行畫圖理解,賦值是從後往前,所以是倒序替換),這種演算法是不是比上一種高效呢?下面我們就來實現以下這種演算法:

#include#include#includevoid replace_black(char *str)

ptr++;

} newopen=oldopen+2*count; //替換之後的陣列的大小

while(oldopen < newopen)

else //是空格則替換

}}int main()

拿到這樣一道題如何去分析呢?首先我們想到的是,如果乙個陣列中前半部分就是奇數,後半部分就是偶數,這當然是最好的情況啦!可是現實總是不如人意啊,如果全部的偶數都在前面而全部的奇數都位於後半部分,這當然是最糟的情況啦,此時我們對每一組資料都要交換

void sort_oddnum_evennum(int arr,int sz)

return 0;

}/* 1 2 3 4

5 8 11 14

6 9 12 15

7 10 13 16*/

int main()

,,,};

printf("請輸入乙個你要查詢的資料:");

scanf("%d",&num);

ret=seek_num(arr,num,0,3); //從右上方開始查詢

if(ret == 1)

else

system("pause");

return 0;

}

劍指offer面試題7

面試題7 用兩個棧實現佇列 using namespace std template class cqueue 預備知識 佇列 佇列也是一種常見的資料結構 特點是先進先出 fifo 在stl中有stack和queue兩個容器 template class stack 成員函式 empty size ...

劍指offer面試題11

面試題1 數值的整數的次方 題目 實現函式double power double base,int exponent 求base的 exponent次方。不得使用庫函式,同時不需要考慮大數問題。思路 首先應該明確指數的可能取值 正整數,0,負整數 另外還需要考慮底數是0的情形。對於負整指數,我們可以...

劍指offer面試題15

面試題15 鍊錶中倒數第k個結點 題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第乙個結點。例如乙個鍊錶有6個結點,從頭結點開始它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個結點是值為4的結點。預備知識 鍊錶結點的定義如下 ...