Java软件工程师笔试题01_统计商品数量(字符串的处理)

今天是第一次笔试,笔试的平台是牛客网,自己选的Java语言进行编程,平台采用的是Java1.8进行编译运行,第一次参加笔试,第一次用Java编程,以前都是用的C++。所以最为一个新接触的新手,难免有坑,别提了,题目不难,但是坑简直不要太多。(让我哭会)
一共4道题在一个半小时之内完成。下面来分析一下我踩过的坑。
试卷共显示6道题,前面两题是例题不计分。这两道例题分别告诉你单行用例输入多行用例输入的格式。然后进入正题:

题目一是这样的:

每个商品都有一个编号,一共有n个商品。给你一个二维数组order_list[ ][ ],[i,j,k]代表商品从编号 i 到 j 的商品需要订购 k 个,要编程输出一个 int[ ]的数组,表示每个商品总共需要订购多少个,数组的下标就是商品的编号。

输入用例是:[[2,4,10], [0,3,15], [3,4,21]],6
输出用例是:[15,15,25,46,31,0]

1、首先第一个坑来了,那就是例题给的输入用例的坑,给的输入例题格式是这样的:

Scanner in = new Scanner(System.in);
while(in.hasNext()){
	...
	...
}

Scanner sc = new Scanner(System.in); //表示从控制台获取数据,以空格为分隔
sc.hasNext(); // 表示你是否有输入数据,
while语句块:表示当你输入数据的时候,就执行输出sc.next()(输出内容)
所以只要你输入数据了,它就可以执行,后台只是开了一块内存,一直未关闭,不算死循环。

hasNext()这个方法是:如果此扫描器的输入中有另一个标记,则返回 true。在等待要扫描的输入时,此方法可能阻塞。扫描器将不执行任何输入。所以循环会一直下去。

你可以设置一个终止符,调用hasNext()的重载方法hasNext(String patten):如果下一个标记与从指定字符串构造的模式匹配,则返回 true。扫描器不执行任何输入。
例:以输入"0",结束输出

Scanner sc = new Scanner(System.in);
while (!sc.hasNext("0")) {
System.out.println(sc.next());
}

上面那段可以这样理解:是把输入放进一个缓冲区类似于集合,按下结束符后,将缓冲区(集合)里的元素分别一个个取出来,在while语句里进行运算,等到元素全部取出来后,计算机又等待输入。

————————————————
一个以前只用C++上机,现在是Java上机新手的我,把代码写到了while语句块{ }的后面,是不是很傻,我写了半天发现怎么输出就是没结果,一直卡在哪里好久,最后考试结束了才在网上查,放在后面是不会输出的,要放在这个while语句块的{ }里面,才会输出。(好吧,这个坑就是栽在了开头)

2、对于这个题目,我遇到的第一个难点就是怎么用Java声明一个一维数组和二维数组啊,我以前都是用C++的,所以对C++的数组声明很熟悉,以前也写过,但是对Java的遗忘了,当时不能上网查,真的想哭,后来上网查了,在这里总结一下。
基本的三种方式

public class ArrayTest{

    public static void main(String args[]){

        // 1
        int[] a=new int[4];
        a[0]=1;
        a[1]=2;
        a[2]=3;
        a[3]=4;
        System.out.println(a[3]);
        
        // 2
        int b[]=new int[4];
        b[0]=1;
        b[1]=2;
        b[2]=3;
        b[3]=4;
        System.out.println(b[2]);

        // 3
        int[] c={1,2,3,4};
        int[] d=new int[]{1,2,3,4};
        System.out.println(c[2]);
        System.out.println(d[3]);
    }
}

在以上的基础上创建多维数组

int[][] arr = {{1,2,3},{4,5,6},{7,8,9}}; //每个子数组的个数不要求均相同
int[][] arr = new int[m][n]; //其中n可以省略
int[][][] arr = new int[m][n][q]; //同样其中n、q可以省略

总结
无论哪种方法声明必须有 :数据类型 [ ] 如:int[ ]。
创建多维数组时new后面的第一个方括号种的元素数量总不能省略。
new 数据类型[]{} 其中花括号可以省去,但要在[ ]中填写数组的个数。
【注意】:上面一维和多维数组创建的方法中,新数组只是指向原数组的存储空间,并没有重新申请新的空间。

补充:若想重新分配空间,改变数组大小,则要使用System.ararycopy方法
思想是这样的:新数组重新申请存储地址空间,再将原数组中数据拷贝过来。

System.arraycopy(originalArray, 0, targetArray, 0, originalArray.length);

3、回到这个题目中来,这个题目的核心就是字符串的处理,也就是考你字符串的一些处理方法的掌握。
字符串的方法参考链接:Java String 类

题目思路很简单,排了这么多坑之后,下面给出我的题解,仅供参考:

package myjob01;

import java.util.Arrays;
import java.util.Scanner;

public class Solution {
    /**
     *
     * @param order_list int整型二维数组 订单
     * @param n int整型 商品种类
     * @return int整型一维数组
     */
    public static int[] func (int[][] order_list, int n) {
        // 累计商品订购数量
        int[] list = new int[n];
        for(int i=0;i<n;i++) {
            for(int j=order_list[i][0];j<=order_list[i][1];j++) {
                list[j]+=order_list[i][2];
            }
        }
        return list;
    }

    public static void main(String[] args) {
        int[][] order_list = new int[1000][3];
        Scanner in = new Scanner(System.in);
        int i=0,j=0,len= 0;
        int n=0;
        String str;
        while (in.hasNext()) {// 注意,如果输入是多个测试用例,请通过while循环处理多个测试用例
            str = in.next(); //Scanner是以空格作为分隔,str是保存每一个小的[i,j,k]
            len = str.length();
            j=0;
            if(str.charAt(len-1)!=','){ //不是以,结尾的话说明是以数字结尾
                n = Integer.parseInt(str.substring(str.lastIndexOf(',')+1, len));//取出数字
                if(i==0) {//当是开头第一个的时候,有两个[[  所以要从2开始截取字符串
                    str = str.substring(2,str.lastIndexOf(']')-1);
                }else {
                    str = str.substring(1,str.lastIndexOf(']')-1);
                }
            }else {
                if(i==0) {
                    str = str.substring(2,len-2);
                }else {
                    str = str.substring(1,len-2);
                }
            }
            for (String s: str.split(",")){//以 , 为分隔符来分隔字符
                if(s!="") {
                    order_list[i][j++] = Integer.parseInt(s); //将字符转化为数字
                }
            }
            i++;
            int[] list = func(order_list,n);
//            for(int t : list) {
//                System.out.println(t);
//            }
            String list_str = Arrays.toString(list);//将一维数组转化成[..,..,..,]的格式输出
            System.out.println(list_str);
        }
    }
}
发布了59 篇原创文章 · 获赞 111 · 访问量 6242

猜你喜欢

转载自blog.csdn.net/qq_37717494/article/details/104976335