最近工作比較忙,且工作重心改變,不再直接從事編程方面的工作。目前的工作,對我來說是個新領域,
我需要不斷學習才能跟上腳步。人生就是充滿挑戰,逆水行舟,不進則退。 以下是一個朋友在北京面試時,
考官出的一道題,他當時遇到點困難,回來就跟我交流了,
題目如下:
一個正整數數組:如, 14 32 133 152
將其串起來得到能表示的最大整數(這里就是3215214133)
看到這個題我立馬想到,這個題毋庸置疑是“排序”。而且這個題很陰險,故意給了一組簡單情況的數字用例。 串起來得到的最大整數,
當然迅速想到以下幾條排序規則:
1,所有正整數中第一個數字最大的,就要排在最前面,而不用管這個數字到底有多長。
2,將最大的那個數提取出來后,繼續執行1。
3,當遇見多個正整數的第一個數字相同時,則比較第二個數字,第二個數字最大的數排前面。
這里第3條規則是存在問題的。例如:32,3。這兩個數字用第三條規則時,會發現無法進行下去,因為3這個正整數不存在第二個數字。
如果你不太小心,就會認為沒有數字時,應該用0來補足。那么利用第三條規則得到的最終最大結果是“323”,而正確結果應該是“332”。
由於第三條規則有問題,接下來修復第三條規則。
通常地,小學生們(也包括你我)比較兩個正整數大小時,會有如下的思維:
1,兩個正整數,位數多的 > 位數少的。
2,相同位數的兩個正整數,先比較最高位,最高位大則正整數大。
3,最高位相同的,則比較次高位,以此類推,直到比較完。最終無法分出大小的,則是相等。
以上3條規則,規則1可以融入到規則2和3中。只需要將位數少的高位補若干個0,達到兩個數位數相同即可。 有了這個小學生都知道的規則基礎,
我知道,只要能把比較的兩個數位數對齊,那條錯誤的規則“3”就正確了。
那怎么將兩個不同的正整數對齊呢。我這里直接給出我的答案。
對齊方式: 數字有0-9,共10種。我現在再加入一個轉基因新品種,叫做“*”。 這個“*”定義為,數字abc* 這個*比自己的首數字“a”大,但是比“a+1”小。
如果a=9,那么*比所有的數字都大。 當兩個數字“abcd”和“ef”,它們需要對齊時,即可在位數少的數字的低位補若干個“*”,達到位數一致。
這時“ef”變成了“ef**”。 這時候就可以用那3條規則由大到小排序了,排序后就得到了最大的結果。
后來我又想到了另外一個方式來做這個題。
方式二:
假設正整數A和正整數B,我們為了得到組合后最大的數,無非就是比較AB和BA哪個大。 通過這種方式,可以比較正整數A和正整數B的大小。
那么我們得到了一個compare函數。
compare(A,B)
{
return AB>BA;
}
有了這個比較函數,就可以用你想用的任何排序算法來得到正確答案。
謝謝大家看到最后,本人水平有限,如有失誤之處歡迎指點。本人郵箱 rongguozhen@foxmail.com