>超级回文数<
>superpalindromesInRange<
一、解题思路
1、解法一( Java )
解法思路: (源自官方解答)
法一:
- 我们需要将奇数和偶数长度分开考虑,这样当长度超出时就可以提前停止循环。
- 检验一个整数是否为回文数,只需要检查它是否等于它的
逆
。构造一个整数的逆,可以按位处理。
法二: 将 10进制
转为 3进制
来求解,但仍以 10位
来计算,此解法更易理解
代码如下:
/**
* @author Authority
* @date 2022-1-9
* 906. 超级回文数 superpalindromesInRange
*/
class Solution {
public int superpalindromesInRange(String sL, String sR) {
long L = Long.valueOf(sL);
long R = Long.valueOf(sR);
int MAGIC = 100000;
int ans = 0;
// count odd length;
for (int k = 1; k < MAGIC; ++k) {
StringBuilder sb = new StringBuilder(Integer.toString(k));
for (int i = sb.length() - 2; i >= 0; --i)
sb.append(sb.charAt(i));
long v = Long.valueOf(sb.toString());
v *= v;
if (v > R) break;
if (v >= L && isPalindrome(v)) ans++;
}
// count even length;
for (int k = 1; k < MAGIC; ++k) {
StringBuilder sb = new StringBuilder(Integer.toString(k));
for (int i = sb.length() - 1; i >= 0; --i)
sb.append(sb.charAt(i));
long v = Long.valueOf(sb.toString());
v *= v;
if (v > R) break;
if (v >= L && isPalindrome(v)) ans++;
}
return ans;
}
public boolean isPalindrome(long x) {
return x == reverse(x);
}
public long reverse(long x) {
long ans = 0;
while (x > 0) {
ans = 10 * ans + x % 10;
x /= 10;
}
return ans;
}
}
运行结果截图如下: