美文网首页
leetcode 903 超级回文数解答

leetcode 903 超级回文数解答

作者: 那么的帅为什么 | 来源:发表于2018-09-18 17:54 被阅读0次

    时间仓促,代码可以优化,主要是思路:

    class Solution {
        public int superpalindromesInRange(String L, String R) {
               long begin  =System.currentTimeMillis();
            long little = Long.valueOf(L);
            long bigger = Long.valueOf(R);
            int count = 0;
            int start = new java.math.BigDecimal(Math.sqrt(little)).setScale(0,java.math.BigDecimal.ROUND_HALF_DOWN).intValue();
            int end  = new java.math.BigDecimal(Math.sqrt(bigger)).setScale(0,java.math.BigDecimal.ROUND_HALF_DOWN).intValue();
                Map<Integer,List> container = new TreeMap<>();
                List<Long> numberSet = new ArrayList<>();
                int nu = start;
                int realStart = 1;
                int realEnd = end;
                int squ =0;
                while(nu!=0){
                    nu /=10;
                    realStart*=10;
                    squ++;
                }
                int endseq = 1;
                while(realEnd !=0){
                    realEnd/=10;
                    endseq++;
    
                }
                List<Long> numberSet2 = new ArrayList<>();
                for (long j =1 ; j < 10; j++){
                    numberSet.add(j);
                    long newVar = Long.valueOf(j+""+j);
                    numberSet2.add(newVar);
                    if (squ<3){
                        long result = j*j;
                        if (result > bigger){
                            break;
                        }
                        if (little<= result &&result < bigger){
                            long subnumber = result;
                            long subtemp = 0;
    
                            while( subnumber > 0 ){
                                subtemp=subtemp*10+(subnumber%10);
                                subnumber=subnumber/10;
                            }
    
                            if (result==subtemp){
                                count++;
                            }
                        }
    
                        result = newVar*newVar;
    
                        if (little<= result &&result < bigger){
                            long subnumber = result;
                            long subtemp = 0;
    
                            while( subnumber > 0 ){
                                subtemp=subtemp*10+(subnumber%10);
                                subnumber=subnumber/10;
                            }
    
                            if (result==subtemp){
                                count++;
                            }
                        }
                    }
                }
                container.put(1,numberSet);
                container.put(2,numberSet2);
                realStart =10;
                for (int l = 3; l < endseq ; l++){
                    realStart = realStart*10;
                    List<Long>  preList = container.get(l-2);
                    numberSet = new ArrayList<>();
                    for (Long var : preList){
                        for(int i = 1 ; i <=9 ; i++){
                            long newVal = i*realStart+i+var*10;
                            numberSet.add(newVal);
                            if (l < squ){
                                continue;
                            }
                            long result = newVal*newVal;
                            if (result > bigger){
                                break;
                            }
                            if (little<= result &&result < bigger){
                                long subnumber = result;
                                long subtemp = 0;
    
                                while( subnumber > 0 ){
                                    subtemp=subtemp*10+(subnumber%10);
                                    subnumber=subnumber/10;
                                }
    
                                if (result==subtemp){
                                    count++;
                                }
                            }
    
                        }
                        if (var%10==1){
                            for(int i = 1 ; i <=9 ; i++){
                                long newVal ;
                                if (var < 10){
                                    newVal = i*realStart+i+var*10-1*(realStart/10);
                                }else{
    
                                    newVal = i*realStart+i+var*10-10-1*(realStart/10);
                                }
                                numberSet.add(newVal);
                                long result = newVal*newVal;
                                if (result > bigger){
                                    break;
                                }
                                if (little<= result &&result < bigger){
                                    long subnumber = result;
                                    long subtemp = 0;
    
                                    while( subnumber > 0 ){
                                        subtemp=subtemp*10+(subnumber%10);
                                        subnumber=subnumber/10;
                                    }
    
                                    if (result==subtemp){
                                        count++;
                                    }
                                }
    
                            }
                        }
                    }
                    container.put(l,numberSet);
                }
            System.out.println(System.currentTimeMillis()-begin);
            return count;
        }
    }
    

    相关文章

      网友评论

          本文标题:leetcode 903 超级回文数解答

          本文链接:https://www.haomeiwen.com/subject/sbcmnftx.html