每日一题做题记录,参考官方和三叶的题解 |
文章目录
题目要求
思路:暴力
n n n位数的乘积最大是 2 n 2n 2n位,所以在 2 n 2n 2n范围内找最大的符合条件的数就行了:
- n = 1 n=1 n=1,直接返回 9 9 9;
-
n
>
1
n>1
n>1,从大到小枚举所有的回文串,判断是否能拆解为两个
n
n
n位数的乘积。
- 枚举时只要枚举前半部分就好(回文所以后半部分反过来就好),前半部分刚好是 n n n位,所以从最大的 n n n位数 m a x max max开始枚举。
- 拆解时也只需要从大到小去试(较大者),然后除出另一个结果(较小者),到当前数的平方都小于目标时,说明再小的数更不可能满足条件,所以跳出循环。
Java
class Solution {
public int largestPalindrome(int n) {
if(n == 1)
return 9; //特殊处理
int max = (int) Math.pow(10,n) - 1; //n位最大数
for(int i = max; i > 0; i--) {
long pd = i, t = i;
//拼接回文数
while(t != 0) {
pd = pd * 10 + (t % 10);
t /= 10;
}
//计算是否能拆成两个数
for(long j = max; j * j >= pd; j--)
if(pd % j == 0)
return (int)(pd % 1337);
}
return -1;
}
}
- 时间复杂度: O ( 1 0 2 n ) O(10^{2n}) O(102n)
- 空间复杂度: O ( 1 ) O(1) O(1)
C++
class Solution {
public:
int largestPalindrome(int n) {
if(n == 1)
return 9; //特殊处理
int max = pow(10,n) - 1; //n位最大数
for(int i = max; i > 0; i--) {
long pd = i, t = i;
//拼接回文数
while(t != 0) {
pd = pd * 10 + (t % 10);
t /= 10;
}
// 计算是否能拆成两个数
for(long j = max; j * j >= pd; j--)
if(pd % j == 0)
return (int)(pd % 1337);
}
return -1;
}
};
- 时间复杂度: O ( 1 0 2 n ) O(10^{2n}) O(102n)
- 空间复杂度: O ( 1 ) O(1) O(1)
总结
……恶心困难题,竟然是靠四舍五入暴力方法,还不如做个简单题开心有收获……
【话说数据范围是 1 ∼ 8 1\sim8 1∼8,评论里出现了一堆面向测试的解决方案更快乐一点】
欢迎指正与讨论! |