PTA非零返回-7-9 jmu-Java-02基本语法-01-综合小测验

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;
            }
        }
    }
}

你可能感兴趣的:(java程序设计,java,算法,开发语言)