小鱼的数字游戏
题目描述
小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字 a i a_i ai(长度不一定,以 0 0 0 结束),记住了然后反着念出来(表示结束的数字 0 0 0 就不要念出来了)。这对小鱼的那点记忆力来说实在是太难了,你也不想想小鱼的整个脑袋才多大,其中一部分还是好吃的肉!所以请你帮小鱼编程解决这个问题。
输入格式
一行内输入一串整数,以 0 0 0 结束,以空格间隔。
输出格式
一行内倒着输出这一串整数,以空格间隔。
样例 #1
样例输入 #1
3 65 23 5 34 1 30 0
样例输出 #1
30 1 34 5 23 65 3
提示
数据规模与约定
对于 100 % 100\% 100% 的数据,保证 0 ≤ a i ≤ 2 31 − 1 0 \leq a_i \leq 2^{31} - 1 0≤ai≤231−1,数字个数不超过 100 100 100。
代码
第一次
import java.util.Scanner;
@SuppressWarnings("all")
public class Main{
public static void main(String [] args){
Scanner scanner = new Scanner(System.in);
StringBuffer stringBuffer = new StringBuffer();
String temp = new String();
while((temp=scanner.next())!="0") {
stringBuffer.append(temp+" ");
temp=null;
}
temp = stringBuffer.toString();
String[] split = temp.split(" ");
for(int i=split.length ;i>0;i--) {
System.out.print(split[i-1]+" ");
}
}
}
正确的
import java.util.Scanner;
@SuppressWarnings("all")
public class Main{
public static void main(String [] args){
Scanner scanner = new Scanner(System.in);
StringBuffer stringBuffer = new StringBuffer();
String temp = new String();
while(!((temp=scanner.next()).equals("0"))) {
stringBuffer.append(temp+" ");
temp=null;
}
temp = stringBuffer.toString();
String[] split = temp.split(" ");
for(int i=split.length ;i>0;i--) {
System.out.print(split[i-1]+" ");
}
}
}
错误的地方
用字符串、一些对象(非基本数据类型)
如果你要判断相等的话
最好是用equals
而不是==
第一行的代码主要错在
while((temp=scanner.next())!="0")
经过大量测试,我发现我的问题,并且优化了(算是吧)我的这个代码
优化部分
temp=null;
这行代码可以取出
应为String本身就是final属性
你重新赋值的话,会改变指向,并且原来的数据会被新数据覆盖(虽然正常数据也是这样,脑子抽了写代码的时候)
问题部分
while((temp=scanner.next())=="0")
赋值运算符本身也是一个语句,它的返回值是等号右边的值(也就是赋值的值)
我们写的是什么?是0,是数字0啊,不是字符0,字符0对应还有ascll码肯定不是数字0,所以这行代码即使我们输入0也不会退出循环
但是其实输入0时temp本身还是和“0”的地址相同的
因为
对string直接赋值,string对象指向常量池(可以看我的String类解析那一篇)
如果new string会先在堆建立一个空间,里面有val属性指向我们常量池的属性,我们string就是指向堆中的空间