[洛谷每日一题]P1553 数字反转(升级版)

这是一道字符串处理题,有很多细节在这记录一下;上题:

 

翻转数字 

初步想法是新建一个新字符串,利用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)+'%');
		}
	}

}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值