这是一道字符串处理题,有很多细节在这记录一下;上题:
翻转数字
初步想法是新建一个新字符串,利用for循环将需要处理的字符串的最后一位放到新建字符串首位,以此类推达到翻转目的。但是会有下面这几种情况会出错:
1."600"翻转成"006"
2."006"翻转成"600"
于是,引入几个判断,分别去掉翻转后字符串“头”的0,和需要翻转字符串“尾”的0:
//删除字符串开头的0
while(a.charAt(0) == '0') {
if(a.equals("0")) break;
a = a.substring(1);
}
//将字符串逆序
String ss="";
for(int i = a.length()-1; i >= 0; i --) {
ss = ss + a.charAt(i);
}
//删除字符串末尾的0
while(ss.charAt(0) == '0') {
if(ss.equals("0"))
break;
ss = ss.substring(1);
}
其中,需要特别注意,单独一个0的情况,不能删没了,在代码中用if处理;
关于Double类型 数字相加减运算处理问题
在处理小数翻转中,发现600.048-600=0.047999999的情况,查阅资料后,使用BigDecimal处理;
case 2:
BigDecimal zong = new BigDecimal(str);//600.84
BigDecimal zhengshu = new BigDecimal((int)Double.parseDouble(str));//600
BigDecimal xiaoshu = zong.subtract(zhengshu);//0.84
//处理整数
String str_zheng = zhengshu.toString();//"600"
System.out.print(reverse(str_zheng)+'.');
//处理小数
String str_xiao = xiaoshu.toString();//"0.84"
str_xiao = str_xiao.substring(2);
System.out.print(reverse(str_xiao));
break;
字符串比较相等问题
不能直接str == "123";
直接用==是比较字符串所在地址,如果要比较字符串内容是否相等,需要用string的方法equals(返回值为boolean类型)
包的引入问题
BigDecimal所属java.math
字符串处理包括在了java.util
附上我的AC代码:
package p1553;
import java.util.*;
import java.math.*;
public class Main {
public static String reverse(String a) {//数字反转转化为字符串处理
//删除字符串开头的0
while(a.charAt(0) == '0') {
if(a.equals("0")) break;
a = a.substring(1);
}
//将字符串逆序
String ss="";
for(int i = a.length()-1; i >= 0; i --) {
ss = ss + a.charAt(i);
}
//删除字符串末尾的0
while(ss.charAt(0) == '0') {
if(ss.equals("0"))
break;
ss = ss.substring(1);
}
return ss;
}
public static void main(String[] args) {
//录入数据
Scanner in = new Scanner(System.in);
String str = in.next();
int flag = 1;
//用于标识到底是哪种数
for(int i = 0; i < str.length(); i ++) {
if(str.charAt(i) == '.')flag = 2;//是小数
if(str.charAt(i) == '/')flag = 3;//是分数
if(str.charAt(i) == '%')flag = 4;//是百分数
}
//分别处理数据
switch(flag) {
//整数
case 1:
System.out.print(reverse(str));
break;
//小数
case 2:
BigDecimal zong = new BigDecimal(str);//600.84
BigDecimal zhengshu = new BigDecimal((int)Double.parseDouble(str));//600
BigDecimal xiaoshu = zong.subtract(zhengshu);//0.84
//处理整数
String str_zheng = zhengshu.toString();//"600"
System.out.print(reverse(str_zheng)+'.');
//处理小数
String str_xiao = xiaoshu.toString();//"0.84"
str_xiao = str_xiao.substring(2);
System.out.print(reverse(str_xiao));
break;
//分数
case 3:
String fenmu = "";
int i;
for(i = 0; str.charAt(i) != '/'; i++) {
fenmu += str.charAt(i);
}
String fenzi = str.substring(++i);
System.out.print(reverse(fenmu)+'/');
System.out.print(reverse(fenzi));
break;
//百分数
case 4:
String shuzi = "";
for(i = 0; str.charAt(i) != '%'; i++) {
shuzi += str.charAt(i);
}
System.out.print(reverse(shuzi)+'%');
}
}
}