【LeetCode刷题】NO.47---第2217题

120 阅读2分钟

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 * 104
  • 1 <= queries[i] <= 109
  • 1 <= intLength <= 15

二、思路分析:

首先这道题目不能够盲目地去做,而是要先寻找规律,然后利用规律去求解问题,很显然,回文数代表着我们做题的时候我们只需要考虑它的前半部分即可,后续添加进结果集只需要反转字符串加入结果集。

这道题目需要考虑到:

  1. 如果求第i个较小回文数没有我们需要返回-1
  2. 在最后的将前半部分元素转换成整个元素的时候我们需要考虑它的奇偶性 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
};

四、总结:

这道题目提醒我们做题目的时候需要先仔细审题,找规律等等。以及再写代码的过程中需要了解jsapi每个参数的含义以及适用于哪种数据类型,这样我们才可以完整的求解问题。