Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一.题目:
2217. 找到指定长度的回文数 给你一个整数数组
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, 201, ...
第 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 * 1041 <= queries[i] <= 1091 <= intLength <= 15
二、思路分析:
首先这道题目不能够盲目地去做,而是要先寻找规律,然后利用规律去求解问题,很显然,回文数代表着我们做题的时候我们只需要考虑它的前半部分即可,后续添加进结果集只需要反转字符串加入结果集。
这道题目需要考虑到:
- 如果求第
i个较小回文数没有我们需要返回-1 - 在最后的将前半部分元素转换成整个元素的时候我们需要考虑它的
奇偶性3.如何求第i个较小的回文数
对于第一个问题我们只需要设置一个最大值即可,因为每个长度的回文数数量是有规律的。而对于第2个问题,我们只需要在初始化的时候判断他的奇偶性,然后再添加结果集的时候,如果是奇数的情况需要不考虑前半部分的最后一个元素,如果是偶数就全部进行翻转。最后第三个问题的就是利用我们初始化的base,利用base+queries[i]-1就能够求得第i个回文数。
三、代码:
/**
* @param {number[]} queries
* @param {number} intLength
* @return {number[]}
*/
var kthPalindrome = function (queries, intLength) {
//已知是回文,我们只需要找到元素的前半部分是什么即可得到整个元素
//考虑到有可能选取的元素在固定长度的回文数中没有出现,所以需要基本数base和最大回文数个数large初始化他们
let res = []
let base = large = 0
//需要判断固定长度的奇偶性,如果是奇数的话
let isOdd = false
let plus = parseInt(intLength / 2)
if (intLength % 2 == 0) {
base = Math.pow(10, plus - 1)
large = Math.pow(10, plus - 1) * 9
} else {
base = Math.pow(10, plus)
large = Math.pow(10, plus) * 9
isOdd = true
}
let len = queries.length
for (let i = 0; i < len; i++) {
//首先判断第i个小的回文数是否在最大回文个数内
if (queries[i] > large) {
res.push(-1)
} else {
//再求第i个小的回文数时,以base位基本数,第i个小的元素的一半就是 base + queries[i] -1(减1因为基本数自身)
let val = base + queries[i] - 1 + '' // 记得转换位字符串
let vallen = val.length
if (isOdd) {
val = val + val.substring(0, vallen - 1).split('').reverse().join('')
} else {
val = val + val.split('').reverse().join('')
}
res.push(parseInt(val))
}
}
return res
};
四、总结:
这道题目提醒我们做题目的时候需要先仔细审题,找规律等等。以及再写代码的过程中需要了解
js的api每个参数的含义以及适用于哪种数据类型,这样我们才可以完整的求解问题。