题目描述 给定一个数,请将该数各个位上数字反转得到一个新数。
这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为0(除非小数部分除了0没有别的数,那么只保留1个0);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为0),本次没有负数。
输入格式 一个数s
输出格式 一个数,即s的反转数
思路: 其实不管是分数, 百分数或者小数, 都可以把它归约为整数字符串的reverse问题, 因为你把它split后, 它就是一个整数字符串. 问题归约以后, 后面的问题就好办了, 下面我来说一说里面容易出错的几个地方.
- 首先, 第一个坑是去除前导零, 尤其是对于小数反转那一种情况更是要特别注意, 整数部分与小数部分的去除前导零的时候是不一样的, 一个是reverse前, 一个是reverse后
- 其次, 是要注意小数的split操作, split() 方法根据匹配给定的正则表达式来拆分字符串。 . 为转义字符,故必须得加 \ , 否则会出错
- 代码如下所示, 写的很烂, 还望批评指正
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
String resStr;
if(str.indexOf('/') != -1) {
String[] strArr = str.split("/");
String numerator = strArr[0];
String denominator = strArr[1];
resStr = removeStartZero(reverseString(numerator)) + "/" + removeStartZero(reverseString(denominator));
} else if (str.indexOf('.') != -1) {
//*** important *** re expression, so in front of the "." should add \\
String[] strArr = str.split("\\.");
String numerator = strArr[0];
String denominator = strArr[1];
resStr = removeStartZero(reverseString(numerator)) + "." + reverseString(removeStartZero(denominator));
} else if (str.indexOf('%') != -1) {
String[] strArr = str.split("%");
String numerator = strArr[0];
resStr = removeStartZero(reverseString(numerator)) + "%";
} else {
resStr = removeStartZero(reverseString(str));
}
System.out.println(resStr);
sc.close();
}
private static String reverseString (String value) {
StringBuffer s = new StringBuffer(value);
return s.reverse().toString();
}
private static String removeStartZero(String value) {
int index = -1;
StringBuffer sb = new StringBuffer();
for (int i = 0; i < value.length(); i++) {
if (value.charAt(i) == '0') {
index = i;
} else {
break;
}
}
//important
if (value.length() == index + 1) {
sb = new StringBuffer("0");
} else if (-1 != index) {
sb = new StringBuffer(value.substring(index + 1, value.length()));
} else {
sb = new StringBuffer(value);
}
return sb.toString();
}
}