图解算法——整数倒置
这是一道比较简单的题目,写出来很容易,但是之所以我写这道题,主要是因为我从这道题中学到了一些新的知识点和用法。
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........