PAT 1136 Java版

版权声明:如若转载,请联系作者。 https://blog.csdn.net/liu16659/article/details/86534798

PAT 1136 Java

1.题意

  • step 1.首先给出了回文数的定义
  • step 2.如果对于一个非回文数,那么我们可以通过一定的步骤将其变成回文数。
  • step 3.如果在10此循环中都无法得到回文数,那么就输出Not found in 10 iterations.
  • step 4.如果该数就是回文数,或者通过一定步骤可以得到一个回文数,则输出xxx is a palindromic number.

2. 分析

  • 因为存在有数据位数比较大的情况,这里使用了BigInteger类计算两个数的和。
  • 分四个方法,分别是用于计算逆转数,求和,判断是否回文,以及main方法

3.测试用例

97152

196

0

4.代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        Reader.init(System.in);
        String origin = Reader.next();
        int count = 0;
        while (count < 10 ) {
            if (isPalindromic(origin)) {
                System.out.printf("%s is a palindromic number.",origin);
                break;
            }
            String reverse = reverse(origin);
            origin = cal(origin, reverse);
            //System.out.println(isPalindromic(cal(origin,reverse)));
            count++;
        }

        if (count == 10) {
            System.out.println("Not found in 10 iterations.");
        }
    }

    //计算number的倒数
    //因为 number 可能会很大,所以需要使用String 存储
    public static String reverse(String number) {
        String reverse="" ;
        char c ;
        for (int i = number.length() - 1; i >= 0; i--) {
            c = number.charAt(i); // get the
            reverse = reverse + c;
        }
        return  reverse;
    }

    //计算两个整数的和
    public static String cal(String num1,String num2) {
        BigInteger bi_1 = new BigInteger(num1);
        BigInteger bi_2 = new BigInteger(num2);
        BigInteger sum = bi_1.add(bi_2);
        System.out.printf("%s + %s = %s",bi_1.toString(),bi_2.toString(),sum.toString());
        System.out.println();
        return sum.toString();
    }

    //对一个数进行回文判断
    public static boolean isPalindromic(String number) {
        final boolean FALSE = false;
        final boolean TURE = true;
        int k = number.length();
        int i =0;
        int mid = k/2;
        while (i < mid) {
            if(number.charAt(i) != number.charAt(k - 1 - i))
                break;
            i++;
        }
        if (i < mid) {
            return  FALSE;
        }
        return TURE;
    }
}


class Reader {
    static BufferedReader reader;
    static StringTokenizer tokenizer;

    /** call this method to initialize reader for InputStream */
    static void init(InputStream input) throws IOException {
        reader = new BufferedReader(new InputStreamReader(input) );
        tokenizer = new StringTokenizer("");
    }

    /** get next word */
    static String next() throws IOException {
        while ( ! tokenizer.hasMoreTokens() ) {//如果后面还有数据,则直接返回
            //TODO add check for eof if necessary
            tokenizer = new StringTokenizer(reader.readLine() );//否则,读取下一行
        }
        return tokenizer.nextToken();
    }

    static int nextInt() throws IOException {
        return Integer.parseInt( next() );
    }

    static double nextDouble() throws IOException {
        return Double.parseDouble( next() );
    }

    //获取字符 => 因为 next()方法返回的是一个String
    static char nextChar() throws IOException {
        return next().charAt(0);
    }
}

5.执行结果

在这里插入图片描述
400ms都有超时的情况,因为这是java。优化过程如下:

6.优化过程

  • 可以看到上述的代码中使用了String进行了一个拼接,导致出现运行超时,我们使用 StringBuilder 替换 String,得到代码如下:
    public static String reverse(String number) {
        StringBuilder reverse= new StringBuilder();
        char c ;
        for (int i = number.length() - 1; i >= 0; i--) {
            c = number.charAt(i); // get the
            reverse.append(c);
        }
        return  reverse.toString();
    }

再次提交代码,ok。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/liu16659/article/details/86534798