2013-03-06 57 views
3

如果< = 10 * b且b < = 10 * a,則兩個數字(a,b)被認爲是相似的。現在給出兩個範圍低和高,返回包含給定範圍之間最大不包含非相似數字的集合。查找給定範圍之間的最大相似數字

我只能想到蠻力的方法。只需要想法如何以更好的複雜性解決這個問題。

+0

你能改正/改寫你的文章並觀看你的語法嗎?真的很難得到你的意思。 – marsze 2013-03-06 09:28:17

+0

@marsze問題明確陳述..什麼是不清楚給你 – Algorithmist 2013-03-06 09:46:34

+0

我不明白這句話「返回包含最大數量的非相似數字在給定範圍之間的集合」您能否闡述或舉例? – Kunukn 2013-03-06 13:41:12

回答

3

從你的描述中我看到兩個數字是相似的,如果它們中較大的一個不比小的大10倍。因此,如果您想從範圍[low ... high]中找到最大數字集合,以便該集合中沒有兩個數字相似,則解決方案將從範圍中的最小數字開始,即從「low」開始,並且每次取與該集合中任何數字不相似的下一個最小數字(或者如果您只是檢查它是否與該集合中的最大元素不相似),則該數字與之相同。

算法:

採取,然後10 *低+ 110 *(10 *低+ 1)+ 1等...直到它超過限制。

+0

可以解釋這個答案背後的邏輯。爲什麼它總是從低位開始。 – Algorithmist 2013-03-06 09:56:54

+0

它不一定要從低處開始,但是對於人來說更容易理解/更加自然地向上計數。您也可以通過以下方式解決: 取*高*,然後*高/ 10 - 1 *,* ans/10 - 1 *等,直到下一個計算答案低於*低*限。 – deed02392 2013-03-06 10:06:36

+0

當然,有趣的是證明/反駁你得到相同數量的元素,無論你是從低位還是高位開始;) – us2012 2013-03-06 10:10:00

0

如果我理解正確的問題,這應該工作:

// start with smallest number: 

var numbers = []; 
var number = range.lowest; 
// while not reached end of range 
while (number <= range.highest) { 
    // add this number; 
    numbers.push(number); 
    // find next not similar number 
    number = numbers * 10 + 1; 
} 

// start with highest number: 

var numbers = []; 
var number = range.highest; 
// while not reached end of range 
while (number >= range.lowest) { 
    numbers.push(number); 
    // find next non-similar number 
    var newNumber = Math.floor(number/10.0); 
    if (numNumber == number/10.0); 
     newNumber--; 
    number = newNumber; 
} 

後一種方法也許可以找到更多的數字,比第一個,試試吧。但是,可能總是會有不同組的不相似的數字,並且可能具有相同的大小。

相關問題