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;    }}

原创粉丝点击