力扣479(java)-最大回文数乘积(困难)
题目:
给定一个整数 n ,返回 可表示为两个 n 位整数乘积的 最大回文整数 。因为答案可能非常大,所以返回它对 1337 取余 。
示例 1:
输入:n = 2
输出:987
解释:99 x 91 = 9009, 9009 % 1337 = 987
示例 2:
输入: n = 1
输出: 9
提示:
1 <= n <= 8
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/largest-palindrome-product
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
数学思维枚举:从n位数构成的最大整数开始从大到小枚举回文数,然后看这个回文数能否由最大整数相乘得到。
1.两个n位数相乘,乘积的位数为 2*n 位,要么为 2*n -1 位;
2.从大到小枚举一个n位数,作为回文数的前半部分,然后根据回文规则,生成回文数的后半部分;
3.最后判断构造的这个回文数,能否整除两个相同的n位数,如果能,则将回文数与1337取余返回即可,不能则返回 -1。
注释:
1.n为1时,最大整数为9, 9*9=81,小于81的回文数有:77,66,55,44,33,22,11,但是这些都不能整除两个相同的1位整数,只能回到回文数为1位的数 9。
2.Math.pow(10, n) - 1 : n位数的最大数为 [ 最小的n+1位数 - 1]
例如:2位数的最大数为 : 1000 - 1 = 99
3位数的最大数为 : 10000 - 1 = 999
4位数的最大数为 : 100000- 1 = 9999
3. (int) Math.pow(10, n) - 1 :为什么要强制转换为 int 类型?
因为math函数返回的是浮点数,而结果需要整数,所以要强制转换为int 类型
4.从大到小枚举回文的前半部分时,构造回文的后半部分
// 99 --> 9999
// 98 --> 9889
// 97 --> 9779
// 96 --> 9669
// ...
// 90 --> 9009
while(t != 0){
num = num * 10 + (t % 10);
t /= 10;
}
5.检查num能否由两个相同的n位整数的乘积构成
//j * j >= num 两个n位整数乘积最小边界为当前的回文num
//j是递减的,如果j * j < num,说明j需要乘一个大于j的数才有可能等于num,但是比j大的数在前面已经除过了
for(long j = max; j * j >= num; j--){
if(num % j == 0){
return (int)(num % 1337);
}
}
6.为什么要将 j 设置成 long型?
210约等于103,int的最大值231约等于109,如果将 j 设置成 int 类型,当n >= 5 时, j * j 就会超出int 类型的最大长度。
代码:
1 class Solution {
2 public int largestPalindrome(int n) {
3 if(n == 1) return 9;
4 //n位数的最大整数
5 int max = (int) Math.pow(10, n) - 1;
6 //从大到小开始枚举
7 for(int i = max; i >= 0; i--){
8 long num = i;
9 long t = i;
10 //构造回文的后半部分
11 while(t != 0){
12 num = num * 10 + (t % 10);
13 t /= 10;
14 }
15 //判断最大回文数能否整除最大整数
16 for(long j = max; j * j >= num; j--){
17 if(num % j == 0){
18 return (int)(num % 1337);
19 }
20 }
21 }
22 return -1;
23 }
24 }

力扣479(java)-最大回文数乘积(困难)的更多相关文章
- Java实现 LeetCode 479 最大回文数乘积
479. 最大回文数乘积 你需要找到由两个 n 位数的乘积组成的最大回文数. 由于结果会很大,你只需返回最大回文数 mod 1337得到的结果. 示例: 输入: 2 输出: 987 解释: 99 x ...
- Java判断回文数算法简单实现
好久没写java的代码了, 今天闲来无事写段java的代码,算是为新的一年磨磨刀,开个头,算法是Java判断回文数算法简单实现,基本思想是利用字符串对应位置比较,如果所有可能位置都满足要求,则输入的是 ...
- Leetcode 479.最大回文数乘积
最大回文数乘积 你需要找到由两个 n 位数的乘积组成的最大回文数. 由于结果会很大,你只需返回最大回文数 mod 1337得到的结果. 示例: 输入: 2 输出: 987 解释: 99 x 91 = ...
- Java 9.回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true :否则,返回 false .回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 例如,121 是回文,而 123 不是. ...
- 479 Largest Palindrome Product 最大回文数乘积
你需要找到由两个 n 位数的乘积组成的最大回文数.由于结果会很大,你只需返回最大回文数 mod 1337得到的结果.示例:输入: 2输出: 987解释: 99 x 91 = 9009, 9009 % ...
- [Swift]LeetCode479. 最大回文数乘积 | Largest Palindrome Product
Find the largest palindrome made from the product of two n-digit numbers. Since the result could be ...
- java基础——回文数判断
/** * 题目描述: * 有这样一类数字,他们顺着看和倒着看是相同的数,例如:121,656,2332等,这样的数字就称为:回文数字.编写一个函数,判断某数字是否是回文数字. * 要求实现方法: * ...
- JAVA求回文数
Manacher算法(马拉车算法)时间复杂度O(n) 用过中心检测法(就是上面说的O(n2) O(n^2)O(n )的算法)的都知道对于奇数回文串和偶数回文串的处理是不同的,奇数回文串有2n+1 2n ...
- 力扣Leetcode 680. 验证回文字符串 Ⅱ
验证回文字符串 Ⅱ 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串. 示例 1: 输入: "aba" 输出: True 示例 2: 输入: "abca ...
- java解决回文数
递归解决palindrome问题 如果String仅仅只是一个或者0个字符,则它就是palindrome 否则比较字符串第一个和最后一个字符 如果第一个和最后一个字符不同,那么就不是palindrom ...
随机推荐
- 安装debian后,发现进入不了root
回想了一下,自己安装的时候,没有设置root密码! 解决方法: sudo passwd root 随后设置密码: 再次su 就可以进入root目录了!
- 【leetcode 1425. 带限制的子序列和】【矩阵幂快速运算】
class Solution { public int countVowelPermutation(int n) { long[][] matrix = new long[][]{ {0, 1, 1, ...
- 腾讯Linux 运维工程师面试真题
腾讯Linux 运维工程师面试真题 1. 如何防止 DDOS 攻击?如提供足够资源给你,要保证用户访问不影响. 首先确定攻击源范围,如果是处于公司内部,那么暂时性的将这一区域的内部网络封掉,如 果是外 ...
- csproj技巧,以及使用其他类库冲突,以及引入第三方UI方式
1.在项目中我们经常写 string? Message{get;set;} 明明是引用类型,它底下还是会出现波浪线,我们可以打开csproj 找到Nullable将它改为disable,或者删除,它默 ...
- 记录--巧用 overflow-scroll 实现丝滑轮播图
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言: 近期我在项目中就接到了一个完成轮播图组件的需求.最开始我也像大家一样,直接选择使用了知名的开源项目 "Swiper&qu ...
- 记录-关于console你不知道的那些事
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 了解 console ● 什么是 console ? console 其实是 JavaScript 内的一个原生对象 内部存储的方法大部分 ...
- 用cmd检查端口关闭命令
1.进入cmd 2.netstat -o -n -a | findstr :8080 TCP 0.0.0.0:3000 0.0.0.0:0 LISTENING 3116 3.taskkill /F / ...
- mvn命令将 ueditor百度富文本编辑器 所需jar包上传到本地maven仓库
1.需要的jar包位置 在解压后的路径中的jsp/lib下:(UEditor\jsp\lib) 2.打开命令行窗口 WIN+R 输入cmd并回车 直接在命令行输入如下命令:(一个一个输入运行,里面的路 ...
- Scala Map操作
1 package chapter07 2 3 object Test14_HighLevelFunction_Map { 4 def main(args: Array[String]): Unit ...
- C++简单实现vector
向量 向量是序列容器,表示可以更改大小的数组. 就像数组一样,向量对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,并且与数组一样高效.但与数组不同的是,它们的 ...