leetcode 903 超级回文数解答

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

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;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 180,100评论 25 708
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 14,434评论 2 59
  • 经常听到一些家长指责孩子:你怎么一点也不上进,看看你们班的谁谁,人家的成绩如何好。 也常听到一些女人扎推抱怨:我男...
    呐呐葡小萄阅读 691评论 0 1
  • 1.《同学们羡慕的眼光》 晚班要七点半下班,到家应该八点,老公要我直接从补习班接孩子回来。 到了补习班,还有几个没...
    桥上风景阅读 222评论 1 1
  • 凌晨4点多从梦中哭醒。梦里情景是,为了去三亚过年,提前规划让7岁的儿子先出发,原本打算当晚就跟老公追去跟儿子会和,...
    东芸依一阅读 193评论 0 0

友情链接更多精彩内容