[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-删除字符,就是我们想要的字符串了