限制條件:鑑於陣列[a1b2c3d4]轉換成[ABCD1234]
- O(1)空間
- O(n)的時間
這不是一個家庭作業的問題只是我遇到了一個有趣的問題。
下面是我能想到的一些解決方案,但沒有在給定的限制條件下做到這一點。
方法1
*具有O(N)存儲器*
- 鴻溝兩個部分遞歸陣列。 (對於每個子問題,一直劃分到大小< = 2)
- 對每個子問題先用數組排序,然後用數字排序。
- 合併所述子問題陣列
方法2
在爲O(n log n)的時間
- 排序基於字典順序排列變得1234ABCD
- 顛倒陣列的兩半4321dcba
- 逆向整個字符串ABCD1234
方法3
如果號碼的範圍被定義
此外,如果情況是,數字是在特定的範圍內,那麼我可以初始化INT說track = 0; 並設置適當的位,當我遇到數組 例如(1 < < a [2])。 1.交換字母到數組的前半部分 2.標記軌道變量中的數字 3.稍後使用軌道填充數組的後半部分。
方法4 如果我們要刪除的整數的範圍有限,但那麼它將需要更多的內存,我們可以使用方法3 HashMap中。
想不到更好的方法來解決O(1)時間和O(n)空間中的一般問題。
通用這裏的問題是指:
給定一個序列x1y1x2y2x3y3 .... xnyn 其中x1,x2是字母X1 < X2 < .... < XN 和Y1Y2 ... yn是整數。y1 < y2 < .... < yn 排列輸出爲x1x2 ... xny1y2 ... yn
有什麼建議嗎?
你需要弄清楚如何重新排列6個字符不超過8個動作。 (但是,如果需要的話,「行爲」可以是多次交換,並且仍然維持秩序N.)(並且請注意,如您所述,問題沒有提及排序,只是將8個字符重新排列爲定義的序列。) –
@熱舔:我試着在這些線上思考,但最終得到的不是通用的解決方案。 1.上半部分的中心元素例如「1b」,所以我們得到ab12c3d4。 2.交換下半部分ab12cd34的中心元素。 3.交換完整陣列abcd1234的中心2元素。但是這種技術只適用於數組的大小是8的倍數。 –
定義「通用」 - 你沒有說明一個通用的問題。你舉了一個例子,但沒有提示如何推廣。 –