2019春招美团笔试
昨晚笔试,今天来做笔试总结
选择题:刚开始是非技术的选择题
技术性选择题
编程题
首先记编程题:
题目好像是:一同学跑绕n*n的格子外围跑步,每次跑n+1步,然后在第n+1步的地方做一标记,问其做第几个标记的时候遇到重复标记的情况(包括重复格子那一次)。
输入:两行,第一行表示有m种格子操场
第二行表示格子的规模,即各种格子操场的n
输出:m行,每一行对应一种格子操场的标记次数
如输入:
2
4 8
输出:
17
33
思路:首先,这是一个循环遍历格子的过程,而且统计第一次重复遍历同一格时已经标记过的格子数。
故采用取余和map接口的方法进行程序编写,代码如下:
1 import java.util.ArrayList; 2 import java.util.Arrays; 3 import java.util.List; 4 import java.util.Map; 5 import java.util.Scanner; 6 import java.util.TreeMap; 7 8 public class Main { 9 public static void main(String[] args) { 10 Scanner sc = new Scanner(System.in); 11 Main aa = new Main(); 12 int n = sc.nextInt(); 13 if (n == 0) 14 System.out.println(0); 15 int[] a = new int[n]; 16 while (sc.hasNextInt()) {//注意while处理多个case 17 int b = aa.dianshu(sc.nextInt()); 18 System.out.println(b); 19 } 20 } 21 public int dianshu(int n){ 22 if (n == 0){ 23 return 0; 24 } 25 Map<Integer, Integer> map = new TreeMap<Integer, Integer>();//利用map键值对的不可重复性来进行判断 26 while(true){ 27 for(int i=0;i%(n*4)<=n*n+1;i=i+n+1){ 28 int s = i%(n*4);//取余操作 29 if(map.containsKey(s)){ 30 return map.size()+1; 31 } 32 else{ 33 map.put(s, 1); 34 } 35 } 36 } 37 } 38 }
如有纰漏,望提出。
然后是选择题中自己不熟悉的一些知识点:
1.无向图的深度遍历
使用深度优先搜索来遍历这个图的过程具体是:首先以一个未被访问过的顶点为起始顶点,沿当前顶点的边走到未访问过的顶点:当没有未访问的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有的顶点都被访问过。显然,深度优先遍历是沿着图的某一条分支遍历直到末端,然后回溯,在沿着另一条进行同样的遍历,直到所有的顶点都被访问过为止。
原文:https://blog.csdn.net/weixin_42678507/article/details/83114549
补充:java遍历树(深度优先+广度优先)http://www.cnblogs.com/toSeeMyDream/p/5816682.html
2.for循环的实际执行过程
java中for循环i++和++i的区别
首先是for循环的执行过程
for(A;B;C) { D; }
即
- 进入循环执行A;//只是进入的时候执行.
- 执行B;//条件为真才执行D,不然就跳出for了.
- 执行D;
- 执行C;
- 再回到第2步开始执行
为此,在for循环中i++和++i的执行结果是相同的,但是在Java中i++语句是需要一个临时变量取存储返回自增前的值,而++i不需要。这样就导致使用i++时系统需要先申请一段内存空间,然后将值赛如进去,最后不用了才去释放。多了这么一系列操作时间当然多了啊,最后建议大家以后在写for循环且不影响逻辑的情况下多使用++i,少使用i++。
参考:https://blog.csdn.net/github_37847975/article/details/77369851
3.异常抛出时的过程
4.重载、覆盖
重载和覆盖是java多态性的不同的表现方式。其中,重载是在一个类中多态性的一种表现,是指在一个类中定义了多个同名的方法,他们或有不同的参数个数,或有不同的参数类型,或参数顺序不同。与访问修饰符和返回值类型无关。在使用重载时,需要注意以下几点:
1) 重载是通过不同的方法参数来区分的,例如不同的参数个数,不同的参数类型或者不同的参数顺序。
2) 重载和方法的访问修饰符、返回值类型、抛出的异常类型无关。
3) 对于继承来说,如果父类方法的访问修饰符为private,那么就不能在子类对其重载;如果子类也定义了一个同名的函数,这只是一个新的方法,不会达到重载的效果。
覆盖是指子类函数覆盖父类函数。覆盖一个方法并对其进行重写,以达到不同的作用。在使用覆盖时要注意以下几点:
1) 子类中的覆盖方法必须要和父类中被覆盖的方法有着相同的函数名和参数。
2) 子类中覆盖方法的返回值必须和父类中被覆盖方法的返回值相同。
3) 子类中覆盖方法所抛出的异常必须要和父类中被覆盖方法所抛出的异常一致。
4) 父类中被覆盖的方法不能为private,否则其子类只是定义了一个方法,并没有对其覆盖。
覆盖和重载的区别如下:
1) 覆盖是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系。
2) 覆盖只能由一对方法产生关系,重载是多个方法之间的关系。
3) 覆盖要求参数列表相同,重载要求参数列表不同。
4) 覆盖关系中,调用方法是根据对象的类型来决定;而重载关系是根据调用时的实参表与形参表来选择方法体的。
覆盖和重载的区别:https://blog.csdn.net/qiuchaoxi/article/details/79790736
5.多态中子类和父类的关系
java多态性,父类引用指向子类对象
使用父类类型的引用指向子类的对象;
该引用只能调用父类中定义的方法和变量;
如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)
变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。
https://www.cnblogs.com/shilin/p/4784862.html
6.protected和private的访问权限
private修饰词,表示成员是私有的,只有自身可以访问;
protected,表示受保护权限,体现在继承,即子类可以访问父类受保护成员,同时相同包内的其他类也可以访问protected成员。
无修饰词(默认),表示包访问权限(friendly, java语言中是没有friendly这个修饰符的,这样称呼应该是来源于c++ ),同一个包内可以访问,访问权限是包级访问权限;
public修饰词,表示成员是公开的,所有其他类都可以访问;
7.相除和取余
a = 13 / 5,a = 2,其实就是数学上的13 / 5 ,结果为2。
b = 13 % 5,b = 3,这也是数学上的运算,得出余数为3。
c = 5 / 13,c = 0,因为被除数小于除数,结果可以看成0.x,但是int类型是整数类型,所以结果只为0。
d = 5 % 13,d = 5,数学上规定:如果被除数比除数小,商是0,余数就是被除数本身。
取余运算的符号是根据第一个运算数决定的,-13 % 5结果是-3,而13 % -5结果则是3。
原文:https://blog.csdn.net/sinat_41152339/article/details/81054379