实习生面试经历


03.23 参加了腾讯2018暑期实习生在线模拟测试,我个人选择的方向是Web开发,在此谈谈自己对于此次模拟测试的感受。
03.27 网易实习生在线测试(Java方向)
03.28 阿里电话面试(Java研发工程师)

3.23:Tencent暑期实习生在线模拟测试

模拟测试分为两大题,第一题是不定项选择题,第二题为编程题。

不定项选择:

一共10道选择题,涉及的内容还不算太多,

  • 数据结构
  • 数据库
  • 计算机组成原理
  • 计算机网络
  • ……

数据结构

数据结构应该算是此次模拟题的重点吧,多次出现相关的一些数据结构,比如

  • 线性表
  • 链表
  • 二叉树
  • ……

其中线性表和链表考查的是相关的定义。

二叉树考查的是三种遍历(先序遍历、中序遍历、后序遍历)
我自己在做这个题目的时候一开始懵了。题目给的是对称排序(也就是中序遍历),一想二叉树里面没听说过这个对称排序啊,后来看到选项之后才明白是所谓的中序遍历。这个题目给出的是中序遍历结果和后序遍历结果,要求选出符合条件的先序遍历结果。


数据库

数据库是给出两张表和一条SQL语句。

  • join的几种表连接方式
  • 对结果降序排desc
  • limit关键字
  • 不同SQL语句的效果

Join有四种表的连接方式有内连接、左连接、右连接、全连接。
测试的时候对limit这个关键字的作用忘记了,所以这道题感觉凉凉。

上网查找limit:对搜索结果进行偏移

SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

在我们使用查询语句的时候,经常要返回前几条或者中间某几行的数据,这个时候就可以使用limit了。

SELECT * FROM table LIMIT 5,10;

上面的sql语句表示检索记录行 6-15


计算机组成

虚拟内存的求解
32位的Linux操作系统,内存为2GB,硬盘大小为64GB,问最大(?)虚拟内存的大小。(不太记得题目了)。

还有一题是:
一个QQ号有8种状态,全球有42亿个QQ号,问多大的存储空间可以全部存储这些QQ号的全部状态。

计算机网络

就是一些TCP/UDP/...的一些协议


编程题


第一题

给定n组数据,依次给出每组数据的四个点的横坐标,再依次给出纵坐标,,判断其是否能组成一个正方形

 

输入:

3

0 0 2 2

0 2 0 2

0 1 5 6

1 6 0 5

0 0 7 7

0 3 0 3

 

输出:

Yes

Yes

No

 

我自己的思路

  1. 每两个顶点求一次距离,判断距离是否相等
  2. 求对角线的斜率相乘等于-1

第二题

小Q非常富有,拥有非常多的硬币,小Q的拥有的硬币是有规律的,对于所有的非负整数K,小Q恰好> 各有两个数值为2^k,的硬币,所以小Q拥有的硬币是1,1,2,2,4,4……,小Q卖东西需要支付元钱,请问小Q想知道有多少种组合方案。
输入:一个n (1<=n<=10^18),代表要付的钱
输出:表示小Q可以拼凑的方案数目

输入:

6

输出:

3

我自己的思路

  1. for循环求解
  2. 然后发现1<=n<=10^18,就知道肯定运行不起来

PS:编程一开始想用C语言来编写,发现很多基础的语法都不是很记得了,最后还是改用Java来写的。


编程题题解

编程题题解



3.27:网易实习生在线测试

选择题

  • 待更新……

编程题

1、矩形重叠

2、正数对问题

 

 

3、小伙伴找工作

 

编程题题解


问答题

第一小题

Vector、ArrayList、LinkedList在各个情况下的性能

第二小题

同步/异步IO



3.28:阿里电话面试

自我介绍

介绍自己参与过的项目

数据库部分

1、JDBC连接数据库的过程

  • 加载JDBC驱动程序

try{

//加载MySql的驱动类

Class.forName("com.mysql.jdbc.Driver") ;

}

catch(ClassNotFoundException e){

System.out.println("找不到驱动程序类 ,加载驱动失败!");

e.printStackTrace() ;

}

 

  • 提供JDBC连接的URL

jdbc:mysql://localhost:3306/test?useUnicode=true & useSSL=false & characterEncoding=gbk;

  • 创建数据库的连接

//连接MySql数据库,用户名和密码都是root

String url = "jdbc:mysql://localhost:3306/test" ;

String username = "root" ;

String password = "root" ;

try{

Connection con = DriverManager.getConnection(url , username , password ) ;

}catch(SQLException se){

System.out.println("数据库连接失败!");

se.printStackTrace() ;

}

 

  • 创建一个Statement

tatement stmt = con.createStatement() ;
PreparedStatement pstmt = con.prepareStatement(sql) ;
CallableStatement cstmt = con.prepareCall("{CALL demoSp(? , ?)}") ;

  • 执行SQL语句

ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;
int rows = stmt.executeUpdate("INSERT INTO ...") ;
boolean flag = stmt.execute(String sql) ;

  • 遍历结果集

/*
两种情况:   
     1、执行更新返回的是本次操作影响到的记录数。   
     2、执行查询返回的结果是一个ResultSet对象。
*/
    
     while(rs.next()){
      String name = rs.getString("name") ;
      String pass = rs.getString(1) ; // 此方法比较高效
  }

 

  • 关闭JDBC对象

/*操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明顺序相反:
 1、关闭记录集
 2、关闭声明
 3、关闭连接对象
*/

if(rs != null){
 try{
  rs.close() ;
 }catch(SQLException e){
  e.printStackTrace() ;
 }
}

if(stmt != null){
 try{
  stmt.close() ;
 }catch(SQLException e){
  e.printStackTrace() ;
 }
}

if(conn != null){
 try{
  conn.close() ;
 }catch(SQLException e){
  e.printStackTrace() ;
 }
}

 

2、MySQL的优势

开源、免费

3、你认为阿里使用的数据库是什么?原因。

我回答的是Oracle,然后就被问到如果非要使用MySQL呢?
其实阿里巴巴在SQL Server和Oracle中自创了一个去IOE概念(我也是后来询问老师得知的)。

4、MySQL数据库优化

5、事务、事务隔离级别

事务的四个特性:原子性、一致性、隔离性、持久性。
事务的隔离级别:Read uncommitted(读未提交) 、Read committed(读提交) 、Repeatable read(重复读) 、Serializable(序列化)。

6、脏读、不可重复读

脏读:
事例:老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,按成3.9万/月,该钱已经打到程序员的户口,但是事务还没有提交,就在这时,程序员去查看自己这个月的工资,发现比往常多了3千元,以为涨工资了非常高兴。但是老板及时发现了不对,马上回滚差点就提交了的事务,将数字改成3.6万再提交。
分析:实际程序员这个月的工资还是3.6万,但是程序员看到的是3.9万。他看到的是老板还没提交事务时的数据。这就是脏读。
不可重复读:
事例:程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(程序员事务开启),收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待妻子转出金额事务提交完)。程序员就会很郁闷,明明卡里是有钱的…
分析:这就是读提交,若有事务对数据进行更新(UPDATE)操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但在这个事例中,出现了一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读。

7、hibernate与ibatis有什么区别

区别:
ibatas的sql语句需要自己手动写,而hibernate能够在程序运行时自动生成。但是不要就这样以为hibernate比ibatas方便,其实二者熟悉之后的效率差不多。而hibernate还能够自动建表等等,这样的好处就在于你带着这个程序,无论到什么机器上,你都不需要数据库,应为它能自动为你完成,而ibatas就必须要有相应的数据库表才能进行移植


Java基础部分

1、基本数据类型与封装类

基本数据类型:
整数类型:byte、int、short、long
浮点类型:float、double
布尔型:boolean
字符型:char

然后问了一个问题(问输出的结果):

long a = 100;
long b = 100;
System.out.println(a == b);

//输出:true

 

2、HashMap的get( )方法
这个操作的原理就比较简单,只需要根据key的Hashcode算出元素在数组中的下标,之后遍历Entry对象链表,直到找到元素为止。

int hash = (key == null) ? 0 : hash(key);
for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) {
    Object k;
    if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))
        return e;
}

分四步:

  1. 判断key,根据key算出索引。
  2. 根据索引获得索引位置所对应的键值对链表。
  3. 遍历键值对链表,根据key找到对应的Entry键值对。
  4. 拿到Value。

分析:
以上四步要保证HashMap的时间复杂度O(1),需要保证每一步都是O(1),现在看起来就第三步对链表的循环的时间复杂度影响最大,链表查找的时间复杂度为O(n),与链表长度有关。我们要保证那个链表长度为1,才可以说时间复杂度能满足O(1)。但这么说来只有那个hash算法尽量减少冲突,才能使链表长度尽可能短,理想状态为1。因此可以得出结论:HashMap的查找时间复杂度只有在最理想的情况下才会为O(1),而要保证这个理想状态不是我们开发者控制的。

3、Java反射机制

在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

4、什么是线程安全和线程不安全?

线程安全:多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。(Vector,HashTable)
线程不安全:不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。(ArrayList,LinkedList,HashMap等)

5、Synchronized关键字

深入理解Java并发之synchronized实现原理

6、分布式系统
什么是分布式系统,如何学习分布式系统

7、设计模式:代理Proxy、动态代理
Java设计模式之代理模式

 

声明:May丶乘剑的部落小阁|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 实习生面试经历


一个努力、偶尔懈怠的"搬砖"的人