zoukankan      html  css  js  c++  java
  • 图解算法——整数倒置

    这是一道比较简单的题目,写出来很容易,但是之所以我写这道题,主要是因为我从这道题中学到了一些新的知识点和用法。

    1、题目描述

    输入一个整数,将这个整数以字符串的形式逆序输出

    程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001。

    输入描述:

    输入一个int整数

    输出描述:

    将这个整数以字符串的形式逆序输出。

    2、示例

    输入:1516000

    输出: 0006151

    3、解题思路

    因为牛客上要求是自己写输入输出的,故,我采用其推荐的Scanner用法来输入。

    思路一是:

    定义输入变量sc,和返回字符串res (注意是stringBuffer类型的,方便拼接);

    然后获取到输入的整数;

    因为我们要倒置整数,故可以从整数的低位(个位)开始往高位(十,百,千,万等)读取,并放入res中,故可以利用求余和求商的算法。

    那么什么时候取到最高位呢?当然是对该整数 n 求商是否为0来判断,获取低位用求余。

    需要注意一点的是,在最后while条件不满足时,此时就剩下最高位了,但是由于是一位,对10求商后,为0,跳出循环,但是该位还未加入到res中,故需要手动再拼接一下,然后再输出。

    代码如下:

    import java.util.Scanner;
    
    public class Main{
        public static void main(String args[]){
            Scanner sc = new Scanner(System.in);
            StringBuffer res = new StringBuffer();
            while(sc.hasNextInt()){
                int a = sc.nextInt();
                while(a/10 != 0){
                    res.append(a%10);
                    a = a/10;
                }
                res.append(a);
                System.out.println(res);
            }
        }
    }

    以上是我的做法,也是比较一般的思路。

    虽然通过了,但是击败率却较低。

    思路二:

    利用StringBuffer的反转功能(reverse()):

    import java.util.Scanner;
    
    public class Main{
        public static void main(String args[]){
            Scanner sc = new Scanner(System.in);
            String str = sc.nextLine();
            StringBuffer res = new StringBuffer(str);
            res.reverse();
            System.out.println(res);
        }
    }

    击败率略有增加:

     但是依然不过半。说明......还有更优的解法!

     我迫不及待地点开题解。

    但是呢?我看了其他解法之后,我发现,我完全被系统提示给限制住了。

     那么究竟是什么解法呢?

    原来是利用输入输出流,InputStream,一个字节一个字节地读取:

    import java.io.IOException;
    import java.io.InputStream;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            InputStream stream = System.in;
            int l;
            byte[] bytes = new byte[1024];
            while((l = stream.read(bytes))>0){
                String numStr = new String(bytes, 0, l - 1);
                char [] numChars = numStr.toCharArray();
                char [] numCharsConvert = new char[numChars.length];
                for(int i =0; i < numChars.length; i++){
                    numCharsConvert[i] = numChars[numChars.length-1-i];
                }
                System.out.println(new String (numCharsConvert));
            }
        }
    }

    最后的for循环也可利用reverse()函数。

    Over........

  • 相关阅读:
    Android自定义属性,format详解
    设置EditText是否可编辑
    Android中Application设置全局变量以及传值
    android:ellipsize属性的含义
    Java集合框架List,Map,Set等全面介绍
    二十款漂亮的CSS字体样式,让你受用非浅
    IE浏览器不见了
    display属性值:
    用CSS设置多个背景、背景渐变、指定背景大小
    [转]IE6双倍边距——IE布局BUG集锦
  • 原文地址:https://www.cnblogs.com/gjmhome/p/15063810.html