簡體   English   中英

查找區間內回文數的算法

[英]Algorithm to find number of palindromes in interval

我目前的任務是編寫一個程序,從<2;36>的間隔計算任何基數的回文數。 問題是我的解決方案充其量只有O(n^2)的時間復雜度,也就是說,如果我坦率地說,真的很慢。

到目前為止,我已經嘗試過一些簡單的解決方案,例如將所有數字從區間轉換為所需的基數,將數字轉換為數組,然后一一檢查每個元素。

這是我到目前為止所得到的:

int isTrue = 1;
int arr[64];

while(n > 0)
{
   arr[counter] = n % base;
   n = n / base;
   counter++;
}

for(int i = 0; i < counter; i ++)
{
   if(arr[i] != arr[counter - i - 1])
   {
      isTrue = 0;
      break;
   }
}

無論如何它都不好,但它確實適用於基本測試。 問題是我目前正在嘗試解決適用於更大數字的獎金之一。

通過更大的數字,我的意思是跨越數十億數字的間隔,其中一個輸入是例如:

c 15 62103360044 155888062462
Result : 123502

其中 c 是程序應該執行的任務(有 l 選項列出了在獎勵測試中沒有出現的所有回文),15 是基數,另外兩個數字是間隔的限制。

我應該在一秒鍾內計算五個這樣的間隔的回文,老實說,我很困惑。

我會很感激任何幫助,如果我的問題格式錯誤或過於冗長,我很抱歉 - 這是我第一次在這里提出問題。

  • 更快地進行回文檢查是一個的優化。 最初我什至會使用 java 的數字到字符串的轉換。

  • 你想要的是在更大的飛躍中跨過這個區間。

  • 您可以在算法的初始版本中使用遞歸進行簡化。

讓我們尋找以 10 為底的:

 62_103_360_044
155_888_062_462

 6 ...        6 (recursion on the middle part)
 7 ...        7
 8 ...        8
 9 ...        9
1 ...         1

你需要:

  • 位數(您的counter
  • 第一個最高有效數字
  • 參數開始和結束

對於這一步,您只需要增加一個數字,甚至可以作為 char 完成。

另請注意,對...的遞歸調用對 7、8 和 9 給出相同的結果,開始 000..000 和結束 999..999。

這將大大加快。 快樂編碼。


遞歸的使用:我沒有給出一個明確的答案,因為這會打敗任務的挑戰。

public BigInteger palindromesInInterval(int base, BigInteger from, BigInteger to) {
    return palindromesRec(base, from.toString(base), to.toString(base));
}

private BigInteger palindromesRec(int base, String from, String to) {
    // Do the simple work:
    if (from.length() > to.length()) {
        return BigInteger.ZERO;
    }
    if (from.length() == to.length() && from.compareTo(to) > 0) {
        return BigInteger.ZERO;
    }
    if (from.length() == 1) {
        ...
    }
    // Do a step:
    int highDigit = Integer.parseInt(from.substring(0, 1), base);
    int lowDigit = Integer.parseInt(from.substring(from.length() - 1), base);

    BigInteger sum = BigInteger.ZERO;
    int digit = Math.max(highDigit, lowDigit);
    String from2 = from.substring(1, from.length() - 2); // Can start with 0
    String to2 = "1000...000" -1; // Niners so to say.
    while (digit < base) {
         ...
         sum = sum.add(palidromesRec(base, from2, to2)); // RECURSION
         from2 = "000...000";
    }
    ...
    return sum;
}

遞歸調用自己,這里只調用一次,沒有額外的參數,經常用到。 例如,將工作拆分為:

from  6 2_103_360_04 4
  to  9 9 ..       9 9

from 1 00 ..       0 1
  to 1 55_888_062_46 2

並計算每個 X

from X 000 X   (n zeroes)
  to X 999 X   (n time (base-1))

作為基礎(n+1)/2

為此,您需要一定程度的抽象/簡化。 把事情簡單化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM