给你一个整数数组 queries 和一个 正 整数 intLength ,请你返回一个数组 answer ,其中 answer[i] 是长度为 intLength 的 正回文数 中第 queries[i] 小的数字,如果不存在这样的回文数,则为 -1 。
回文数 指的是从前往后和从后往前读一模一样的数字。回文数不能有前导 0 。
示例 1:
输入:queries = [1,2,3,4,5,90], intLength = 3
输出:[101,111,121,131,141,999]
解释:
长度为 3 的最小回文数依次是:
101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 202, …
第 90 个长度为 3 的回文数是 999 。
示例 2:
输入:queries = [2,4,6], intLength = 4
输出:[1111,1331,1551]
解释:
长度为 4 的前 6 个回文数是:
1001, 1111, 1221, 1331, 1441 和 1551 。
提示:
1 <= queries.length <= 5 * 104
1 <= queries[i] <= 109
1 <= intLength <= 15
class Solution {
/**
拼凑回文数即可,第几小的回文数前半部分就是pow(10, n) + queries[i] - 1, 偶数直接翻转, 奇数需要去掉反转后的第一位
*/
public long[] kthPalindrome(int[] queries, int intLength) {
int n = queries.length;
long[] res = new long[n];
Arrays.fill(res, -1);
long start = (long)Math.pow(10, intLength - 1 >> 1);
for (int i = 0; i < n; ++i) {
//大于回文数前半部分的就是不存在的
if (queries[i] <= 9 * start) {
long tem = start + queries[i] - 1;
StringBuilder prefix = new StringBuilder(tem + "");
StringBuilder suffix = new StringBuilder(tem + "");
//奇数就截取反转后的第一位之后的
if ((intLength & 1) == 1) prefix.append(suffix.reverse().substring(1));
else prefix.append(suffix.reverse());
res[i] = Long.parseLong(prefix.toString());
}
}
return res;
}
}