给你一个整数数组 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
function kthPalindrome(queries: number[], intLength: number): number[] {
const isOdd = intLength % 2 === 1;
const bestNum = 10 ** ((intLength >> 1) + (isOdd ? 1 : 0) - 1);
const max = bestNum * 9;
return queries.map(v => {
if (v > max) {
return -1;
}
const num = bestNum + v - 1;
return Number(
num +
(num + '')
.split('')
.reverse()
.slice(isOdd ? 1 : 0)
.join(''),
);
});
}
impl Solution {
pub fn kth_palindrome(queries: Vec<i32>, int_length: i32) -> Vec<i64> {
let is_odd = int_length & 1 == 1;
let best_num = i32::pow(10, (int_length / 2 + if is_odd { 0 } else { -1 }) as u32);
let max = best_num * 9;
queries
.iter()
.map(|&num| {
if num > max {
return -1;
}
let num = best_num + num - 1;
format!(
"{}{}",
num,
num.to_string()
.chars()
.rev()
.skip(if is_odd { 1 } else { 0 })
.collect::<String>()
)
.parse()
.unwrap()
})
.collect()
}
}