一個朋友面試時遇到的算法題(怎么組合后得到最大整數)


    最近工作比較忙,且工作重心改變,不再直接從事編程方面的工作。目前的工作,對我來說是個新領域,

我需要不斷學習才能跟上腳步。人生就是充滿挑戰,逆水行舟,不進則退。 以下是一個朋友在北京面試時,

考官出的一道題,他當時遇到點困難,回來就跟我交流了,

 

題目如下:

一個正整數數組:如, 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM