今天是第一次笔试,笔试的平台是牛客网,自己选的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);
}
}
}