[NOIP2011 普及组] 数字反转
题目描述
给定一个整数 N N N,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例 2)。
输入格式
一个整数 N N N。
输出格式
一个整数,表示反转后的新数。
样例 #1
样例输入 #1
123
样例输出 #1
321
样例 #2
样例输入 #2
-380
样例输出 #2
-83
提示
【数据范围】
$-1,000,000,000\leq N\leq 1,000,000,000 $。
noip2011 普及组第一题\
代码
第一遍的
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
@SuppressWarnings("all")
public class Main{
public static void main(String [] args){
	Scanner scanner = new Scanner(System.in);
	String next = scanner.next();
	StringBuffer stringBuffer = new StringBuffer(next);
	stringBuffer.reverse();
	if(Integer.parseInt(next)>0) {
	for(int i=0;i<stringBuffer.length();i++) {
		if(stringBuffer.charAt(i)=='0') {
			stringBuffer.delete(i, i+1);
		}
		else {
			break;
		}
	}
	}
	else if (Integer.parseInt(next)==0) {
		
	} 
	else {
		stringBuffer.delete(stringBuffer.length()-1, stringBuffer.length());
		for(int i=0;i<stringBuffer.length();i++) {
			if(stringBuffer.charAt(i)=='0') {
				stringBuffer.delete(i, i+1);
			}
			else {
				break;
			}
			stringBuffer.insert(0, '-');
	}
		
	
	
	}
	System.out.println(stringBuffer);
}
}
结果
 
我蒙了,然后我看输入
 
 900000000
 我就知道有问题了
 for(int i=0;i<stringBuffer.length();i++)
 这个stringBuffer.length()是会变的,判断一次变一次奥好像?
 比如这个例子,你一直减stringbuffer长度,i也在增长,i=4时候,正好,人家长度变成5了
 正好你判断条件不成立了,后面的条件也判断不了了
 用一个变量存储起来就行了
 而且!删除的位置也是不对的
 stringBuffer.delete(i, i+1);
 这就相当于你判断的第一个删除人家后一个,这种做法不行
 所以,就直接删除第一个就可以
 改为
 stringBuffer.delete(0, 1);
 然后就出乎意料的再一次的给我惊喜
第二次
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
@SuppressWarnings("all")
public class Main{
public static void main(String [] args){
	Scanner scanner = new Scanner(System.in);
	String next = scanner.next();
	StringBuffer stringBuffer = new StringBuffer(next);
	stringBuffer.reverse();
	int length = stringBuffer.length();
	
	if(Integer.parseInt(next)>0) 
	{
	for(int i=0;i<length;i++) {
		if(stringBuffer.charAt(i)=='0') {
			stringBuffer.delete(0, 1);
		}
		else 
			break;
		
	}
	}
	else if (Integer.parseInt(next)==0) {
		
	} 
	else {
		stringBuffer.delete(stringBuffer.length()-1, stringBuffer.length());
		for(int i=0;i<length;i++) {
			if(stringBuffer.charAt(i)=='0') {
				stringBuffer.delete(0, 1);
			}
			else {
				break;
			}
			stringBuffer.insert(0, '-');
	}
		
	
	
	}
	System.out.println(stringBuffer);
}
}
我输入
 600
 他输出06
 我输入60
 他直接报错
 我dbug了一下
 
什么鬼???,我delete(0,1)在我的笔记是删除第0位置上的元素
 然后,我眼睁睁的看着
 stringbuffer存储的数组,的1索引的位置由‘0’变成‘6’
 接下来我又
 “懂了”,我真是有病啊,刚刚还说i增长的问题,其实
 是这个
 **if(stringBuffer.charAt(i)==‘0’)**判断条件的问题
 我其实一直判断第一个字符就可以,因为它是一直减的
最终代码
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
@SuppressWarnings("all")
public class Main{
public static void main(String [] args){
	Scanner scanner = new Scanner(System.in);
	String next = scanner.next();
	StringBuffer stringBuffer = new StringBuffer(next);
	stringBuffer.reverse();
	int length = stringBuffer.length();
	
	if(Integer.parseInt(next)>0) 
	{
	for(int i=0;i<length;i++) {
		if(stringBuffer.charAt(0)=='0') {
			stringBuffer.delete(0,1);
		}
		else 
			break;
		
	}
	}
	else if (Integer.parseInt(next)==0) {
		
	} 
	else {
		stringBuffer.delete(stringBuffer.length()-1, stringBuffer.length());
		for(int i=0;i<length;i++) {
			if(stringBuffer.charAt(0)=='0') {
				stringBuffer.delete(0, 1);
			}
			else 
				break;
			
			
	}
		
		stringBuffer.insert(0, '-');
	
	}
	System.out.println(stringBuffer);
}
}
思路
1.用stringbuffer解决反转问题
 2.内部细节->0/<0/=0处理不一样,分开处理
 3.>0很简单,就一个个判断是0删除就ok
 4.=0更简单,不用处理
 5.<0,先删除最后的-号,然后开始像>0这样一个个判断删除,最后在开头添加-号
总结
对应变量的掌握不太熟练
 就是他自身(操作的对象)就变,你的位置始终其实都在1位就能确定
 不用根据i行事了,固化思维
 还有就是我注意到
 StringBuffer.delete不是真正删除对应的属性的,里面有一个count,来计数有几个有效字符,好像内部是运用替换还是什么的,把删除字符弄到最后,然后count-删除字符,就是我们想要的字符串了



















