此题给定了时间范围后,可以退化为题目所述的问题,即在
O
(
1
)
O(1)
O(1)时间找到长度
l
l
l,第
i
i
i 个回文数。
解决这个问题,我们需要从回文数的性质入手,即前后是对称的,如果是奇数的话,就多看一位,对折前面几位,还是比较简单的。还有就是快速幂,
typedef long long ll;
class Solution {
public:
ll power(ll a, ll n)
{
if(n == 0)return 1;
ll res = power(a, n/2);
res = res*res;
if(n&1)res = res*a;
return res;
}
ll getithp(int len, int i)
{
int front_len = ceil(len/2.0);
int end_len = len/2;
ll mx_num = power(10, front_len)-1, base = power(10, front_len-1);
ll num = mx_num-base+1;
if(i > num)return -1;
ll front_part = base+i-1;
// 获得后半部分
ll end_part = 0;
ll front_copy = front_part;
if(len&1)front_copy /= 10;
while(front_copy > 0)
{
end_part = end_part*10 + front_copy%10;
front_copy /= 10;
}
return end_part + front_part * power(10, end_len);
}
vector<long long> kthPalindrome(vector<int>& queries, int intLength) {
vector<ll> ans;
for(auto q: queries)
{
ll t = getithp(intLength, q);
ans.push_back(t);
}
return ans;
}
};