0数组中等 LeetCode5253. 找到指定长度的回文数

5253. 找到指定长度的回文数
显示英文描述
通过的用户数987
尝试过的用户数1587
用户总通过次数995
用户总提交次数3203
题目难度Medium
给你一个整数数组 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

分析

把回文数切成一半(奇数长度的回文包括中间的数),第q个回文数等于,左半边的最小值加上q-1,然后再把这半边反转拼接在一起。

class Solution {
    public long[] kthPalindrome(int[] queries, int intLength) {
        long min = (long)Math.pow(10,(intLength-2+1)/2);
        long[] ans = new long[queries.length];
        for(int i = 0; i < ans.length; i++){
            int q = queries[i];
            if(q > 9 * min){
                ans[i] = -1;
                continue;
            }
            long cur = min + q - 1;
            StringBuilder sb = new StringBuilder();
            sb.append(cur).reverse();
            String st = sb.toString();
            if((intLength-2) % 2 != 0){
                st = st.substring(1);
            }
            String str = "" + cur + st;
            ans[i] = Long.parseLong(str);
        }
        return ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值