1、最可能的原因是: 输入时nextLine()和next()、nextInt()等混合使用,导致行尾回车没有被处理,从而影响下一次的输入
解决方法:
(1)只使用nextLine()输入,然后把输入得到的字符串转换为所需要的数据类型;
(2)在每一个next()、nextInt()等后面加一个scanner.nextLine(),让它消除行尾没有被处理的空格;
2、另外一种我碰到的原因是: 在Main里直接动态申请数组,导致非零返回(我个人认为是内存问题)
解决方法:
每求出来一个值,就直接输出(例如斐波那契数列),而不是把所有结果求出来后储存到一个数组,最后再一块输出
7-9 jmu-Java-02基本语法-01-综合小测验
方法一:第一种问题的解决方法2
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
int a[] = new int[1];
//String choice = scn.next();//这一句需要删除
while(scn.hasNextLine()){//修改一:针对样例三的非零返回
//这里要开一个while循环,当输入的字符串不是(fib,sort,search,getBirthDate)时,在else分支里break
String choice = scn.nextLine();
//注意这里是第一个字符串的输入,我的代码就是先在while循环外面输入一个字符串(见第6行注释)
//然后判断是不是(fib,sort,search,getBirthDate) 结果:代码有时候会非零返回,有时候会AC
if(choice.equals("getBirthDate") || choice.equals("sort") || choice.equals("search") || choice.equals("fib"))
{
if (choice.equals("getBirthDate")) {
int n = scn.nextInt();
scn.nextLine();//处理行尾回车
String id[] = new String[n], bir[] = new String[n];
for (int i = 0; i < n; i++) {
id[i] = scn.nextLine();
}
for (int j = 0; j < n; j++) {
bir[j] = id[j].substring(6, 10) + "-" + id[j].substring(10, 12) + "-" + id[j].substring(12, 14);
System.out.println(bir[j]);
}
} else if (choice.equals("fib")) {
int n = scn.nextInt();
scn.nextLine();
// int f[] = new int[n];
// f[0] = 1;
// f[1] = 1;
// for (int i = 2; i < n; i++)
// f[i] = f[i - 1] + f[i - 2];
// for (int i = 0; i < n; i++) {
// if (i == 0)
// System.out.printf("%d", f[i]);
// else
// System.out.printf(" %d", f[i]);
// }
// System.out.println();
int first_numb = 1;//修改二:针对样例一的非零返回
//这里不能另外开一个数组,必须根据输入的n,每求出一个斐波那契数列的值就直接输出
//理由:我觉得应该是数组内存问题,直接在这个函数里申请内存然后求解出所有的值
//可能导致程序直接爆而提前返回,所以直接非零返回
int second_numb = 1;
for(int i = 1;i <= n;i++)
{
if(i == 1) {
System.out.print(first_numb);
}
else if(i == 2) {
System.out.print(" "+ second_numb);
}
else if(i >= 3){
int temp = first_numb + second_numb;
first_numb = second_numb;
second_numb = temp;
System.out.print(" "+ temp);
}
}
System.out.println();
} else if (choice.equals("sort")) {
String s[] = scn.nextLine().split(" ");
a = new int[s.length];
for (int i = 0; i < s.length; i++) {
a[i] = Integer.valueOf(s[i]);
}
Arrays.sort(a);
System.out.println(Arrays.toString(a));
}
// else if(choice.equals("search"))
else {
int data = scn.nextInt();
scn.nextLine();//处理行尾回车
int flag = 1;
for (int i = 0; i < a.length; i++) {
if (a[i] == data) {
System.out.println(i);
flag = 0;
break;
}
}
if (flag == 1)
System.out.println(-1);
}//这里的输入注释掉就可以,在while循环刚开始输入也行
//choice = scn.next();
}else{
System.out.println("exit");
//System.exit(0);
break;
}
}
}
}
方法二:第一种问题里的解决方法1
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
int a[] = new int[1];
//String choice = scn.next();//这一句需要删除
//while(scn.nextLine()) 也可以这样写
while(true){//修改一:针对样例三的非零返回
//这里要开一个while循环,当输入的字符串不是(fib,sort,search,getBirthDate)时,在else分支里break
//也可以while循环成立的条件只需要是true就行
//但是全部输入均使用nextLine()并且把第19行if注释,所有均改成该成if ifelse ifelse……
//理由:我觉得是代码太复杂了,导致非零返回
String choice = scn.nextLine();
//注意这里是第一个字符串的输入,我的代码就是先在while循环外面输入一个字符串(第6行语句被注释)
//然后判断是不是(fib,sort,search,getBirthDate) 结果:代码有时候会非零返回,有时候会AC
//理由:行尾回车未被处理
// if(choice.equals("getBirthDate") || choice.equals("sort") || choice.equals("search") || choice.equals("fib"))
// {
//上面这些不理解没关系:记住一个原则,java输入时尽量全部用nextLine(),然后转换为所需要的类型,它会自动处理掉行尾回车
//而next(),nextInt()等等不会自动处理掉行尾回车(这个可以百度查一下具体的解释)
if (choice.equals("getBirthDate")) {
String x = scn.nextLine();
int n = Integer.parseInt(x);
String id[] = new String[n], bir[] = new String[n];
for (int i = 0; i < n; i++) {
id[i] = scn.nextLine();
}
for (int j = 0; j < n; j++) {
bir[j] = id[j].substring(6, 10) + "-" + id[j].substring(10, 12) + "-" + id[j].substring(12, 14);
System.out.println(bir[j]);
}
} else if (choice.equals("fib")) {
String x = scn.nextLine();
int n = Integer.parseInt(x);
// int f[] = new int[n];
// f[0] = 1;
// f[1] = 1;
// for (int i = 2; i < n; i++)
// f[i] = f[i - 1] + f[i - 2];
// for (int i = 0; i < n; i++) {
// if (i == 0)
// System.out.printf("%d", f[i]);
// else
// System.out.printf(" %d", f[i]);
// }
// System.out.println();
int first_numb = 1;//修改二:针对样例一的非零返回
//这里不能另外开一个数组,必须根据输入的n,每求出一个斐波那契数列的值就直接输出
//理由:我觉得应该是数组内存问题,直接在这个函数里申请内存然后求解出所有的值
//可能导致程序直接爆而提前返回,所以直接非零返回
int second_numb = 1;
for(int i = 1;i <= n;i++)
{
if(i == 1) {
System.out.print(first_numb);
}
else if(i == 2) {
System.out.print(" "+ second_numb);
}
else if(i >= 3){
int temp = first_numb + second_numb;
first_numb = second_numb;
second_numb = temp;
System.out.print(" "+ temp);
}
}
System.out.println();
} else if (choice.equals("sort")) {
String s[] = scn.nextLine().split(" ");
a = new int[s.length];
for (int i = 0; i < s.length; i++) {
a[i] = Integer.valueOf(s[i]);
}
Arrays.sort(a);
System.out.println(Arrays.toString(a));
}else if(choice.equals("search")){
// else {
String x = scn.nextLine();
int data = Integer.parseInt(x);
int flag = 1;
for (int i = 0; i < a.length; i++) {
if (a[i] == data) {
System.out.println(i);
flag = 0;
break;
}
}
if (flag == 1)
System.out.println(-1);
}//这里的输入注释掉就可以,在while循环刚开始输入也行
//choice = scn.next();
else{
System.out.println("exit");
break;
}
}
}
}