一道特殊的排序面試題 交換思想活學活用

2021-08-07 16:44:29 字數 1589 閱讀 3997

如字串abcdefg,現在需要按索引順序1、4、2、0、5、3、6重排序,如對於、4、2、0、5、3、6,排序結果為becafdg

面試中很可能遇到這種非常突兀的問題,這需要基礎概念牢固到能夠隨時運用的地步,本題就是乙個鍛鍊

遇到這種題,步驟:在紙上畫心裡思考,盡力找出一種較為簡單的規律,能夠正確完成這樣的變化要求!

演算法題,一部分是考察資料結構掌握,另一部分就是看邏輯思維,隨便過來乙個問題,能不能分析出規律,能不能找到靠譜的方法,能不能轉化為解決問題的**!

像二叉樹也好,鍊錶陣列棧佇列也好,字串也好,圖也好,本身資料結構組成和原理就是那些,包括排序查詢的常規套路就是那些,但是僅僅「理解了」、「背下來了」、「會了」,但運用很差,甚至**還處於漏洞百出,那麼,不僅並不足以通過高難度面試,而且更不足以完成更有挑戰難度的工作

如本題,在紙上畫個簡單的例子,如:

自己假設abcde按1、2、4、0、3變化,如以第乙個字元為「當前」字元,暫存其值a,不斷的修改為新值,直到最後某個地方,它需要填充新值a時,結束,可不可以呢?在紙上試試

第1步:bbcde,當前為a,a要跳到1,替換a為原串第1個字元b,

第2步:bccde,當前為b,b要跳到2,替換b為原串第2個字元c

第3步:bcede,當前為c,c要跳到4,替換c為原串第4個字元e

第4步:bcedd,當前為e,e要跳到3,替換c為原串第3個字元d

第5步:bcead,當前為d,d要跳到0,替換c為原串第0個字元a,a就是第乙個暫存的字元,直接替換掉結束,結果為:bcead,正確,時間複雜度o(n)

ok,紙上找到了正確的思路,然後就是思路轉化為**,用乙個變數代表當前所在索引,再用乙個變數代表下一步跳到**,用乙個字元變數暫存第乙個字元,

每跳一次前更新當前所在索引的新值,然後更新當前索引和下一步跳的索引

注意**中main中大片部分是為了生成乙個[0, n-1]範圍內的不重複的隨機序列(如[0, 7-1]範圍內的「、4、2、0、5、3、6」)

**:

#include #include #include void sort_by_turn (const std::string &str, int *turn) 

size_t idx = 0, next = turn[idx], firstidx = idx;

char flag = res[idx];

do while (firstidx != next);

res[idx] = flag;

std::cout << "result: " << res << std::endl;

return;

}int main ()

std::random_device rd;

for (int i = 0; i < str.length(); i++) else

}for (int i = 0; i < str.length(); i++)

std::cout << std::endl;

sort_by_turn(str, turn);

return 0;

}

一道面試題

一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...

一道面試題

前些時候在找工作,就在準備結束此次找工作歷程的時候,去了一家公司面試,去了之後技術經理直接帶到一台電腦旁,給了一張紙條,上面是這樣的題目 用c或c 來實現 1 建立一棵樹,該樹的深度是隨機的,每個節點的位元組點數是隨機的。2 給每個節點分配一段隨機大小的記憶體空間,給每個節點賦乙個隨機數。3 遍歷這...

一道面試題

如果n為偶數,則將它除以2,如果n為奇數,則將它加1或者減1。問對於乙個給定的n,怎樣才能用最少的步驟將它變到1。例如 n 61 n 60 n 2 30 n 2 15 n 16 n 2 8 n 2 4 n 2 2 n 2 1 public class myclass public static vo...