leetcode[Largest Palindrome Product]
来源:互联网 发布:知乎911是美国自导自演 编辑:程序博客网 时间:2024/06/05 19:44
错误解法(这种解法对于位数高于4的输入会超时):
public class Solution {private int low(int digit){//计算位数为digit的数的最小值int res = 1;for(int i = 0; i < digit - 1; i++){res *= 10;}return res;}private int high(int digit){//计算位数为digit的数的最大值int res = 1;for(int i = 0; i < digit; i++){res *= 10;}return res - 1;}private boolean isPalindrome(int x){//判断一个数是否是回文数int fromTail = 0;int fromHead = x;if(x < 0){//负数不是回文数return false;}if(x % 10 == 0 && x != 0){//这种情况不能用下面的方式判断,因为fromTail的最高位始终是0return false;}while(fromHead > fromTail){fromTail = fromTail * 10 + (fromHead % 10);fromHead /= 10;//System.out.println("head:" + fromHead + " tail:" + fromTail);}if(fromTail == fromHead){return true;} else if(fromTail / 10 == fromHead){return true;} else{return false;}} public int largestPalindrome(int n) {//计算的是最大两个数相乘形成的回文数,只不过将结果对1337取余,不是求回文数对1337取余后的最大的数 int low = low(n);//有更简单的方式:int low = (int) Math.pow(10, n - 1) int high = high(n);//有更简单的方式:int high = (int) Math.pow(10, n) - 1 int product = 0; int res = 0; for(int a = low; a <= high; a++){ for(int b = low; b <= high; b++){ product = a * b; if(isPalindrome(product)){ //System.out.println(product); res = Math.max(res, product); } } } return res % 1337; }}
解法一:
public class Solution {private long createPalindrome(int left){//以左半部为String str = left + new StringBuilder().append(left).reverse().toString(); return Long.parseLong(str);}//前面会超时是因为时间复杂度是O(N*N),这里采用取数的半边,来判断两个n位数的乘积是否是回文数 public int largestPalindrome(int n) {//计算的是最大两个数相乘形成的回文数,只不过将结果对1337取余,不是求回文数对1337取余后的最大的数 int high = (int) (Math.pow(10, n) - 1); int low = (int) Math.pow(10, n-1); // e.g. if n = 3 then maxNumber = 999 x 999 = 998001 so firstHalf = 998 //long的乘法要将high转换一下,要不然还是相当于两个int在相乘!!! long max = (long)high * high;//求出最大的数,既然这个数是最大的,那么高位的左半部也是最大的,从左半部开始往下构造回文数 //有一个细节,除n=1外,n位数和n位数相乘的回文数的位数为偶数 //所以n=1时,单独处理 if(n == 1){ return 9; } int firstHalf = (int)(max / Math.pow(10, n)); for(int i = firstHalf; i >= low; i--){ //System.out.println("左半部 : " + i); long createPalin = createPalindrome(i); //System.out.println("createPalin : " + createPalin); //判断这个通过左半部构造出的回文数是否是由low到high这个范围内的两个数的乘积构成的 for(int j = high; j >= low; j--){ //System.out.println("j : " + j); if(createPalin / j > high){//限制另一个因子 break; } if(createPalin % j == 0){//这里只保证了其中一个因子是在low到high这个范围内,所以在前面还要限制另一个因子 //System.out.println("createPalin : " + createPalin); return (int) (createPalin % 1337); } } } return -1; }}
阅读全文
0 0
- leetcode[Largest Palindrome Product]
- leetcode 479. Largest Palindrome Product
- {LeetCode} 479. Largest Palindrome Product
- LeetCode: 479. Largest Palindrome Product
- leetcode 479. Largest Palindrome Product
- [Leetcode] 479. Largest Palindrome Product 解题报告
- Largest palindrome product
- Largest palindrome product
- 479. Largest Palindrome Product
- 479. Largest Palindrome Product
- 479. Largest Palindrome Product
- 479. Largest Palindrome Product
- 【leetcode】479. Largest Palindrome Product(Python & C++)
- leetcode 479. Largest Palindrome Product最大的回文乘积
- Problem 4:Largest palindrome product
- Problem 4:Largest palindrome product
- PE 4 Largest palindrome product
- Problem 4 Largest palindrome product
- Android主题相关(初探)
- SequenceInputStream 实现文件的切割与合并
- [Vue.js启航]——使用Vuex进行状态管理
- C# DataGridView添加新行的2个方法
- P1192 台阶问题
- leetcode[Largest Palindrome Product]
- Dijkstra模板求单源点最短路径
- 实参和形参
- Spring —— IOC控制反转
- dos命令窗口下下java命令提示找不到或无法加载主类
- spring mvc 和struts2的区别
- Android从普通类跳转到Activity
- js 定时数字跳动
- java Web项目中什么场景中会用到java多线程?