网易互娱面筋
我是学java的,但是面试官似乎是C++,并没有很多设计java方面的知识。
全程基本都是数据结构、算法、计算机网络等
1.算法:求区间合并。类似 给定 n 个区间 [li,ri],求合并后区间
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
(用的C++函数,我换成java的实现了)
class Interval { int start, end; Interval(int start, int end) { this.start = start; this.end = end; } } /** * @author wangyifan */ public class Main { public static List<Interval> merge(List<Interval> intervals) { List<Interval> ans = new ArrayList<>(); if (intervals.size() == 0) { return intervals; } //思路1:先将左半边的数据进行从小到大,排序。 for (int i = 0; i < intervals.size(); i++) { for (int j = i + 1; j < intervals.size(); j++) { if (intervals.get(i).start > intervals.get(j).start) { Interval tem = intervals.get(i); intervals.set(i, intervals.get(j)); intervals.set(j, tem); } } } //从小到大遍历,从最前面开始 int min = intervals.get(0).start; int max = intervals.get(0).end; for (int i = 1; i < intervals.size(); i++) { //intervals.get(i).start <= max,就进行区间,重叠即合并区间 if (intervals.get(i).start <= max) { //取大 max = Math.max(intervals.get(i).end, max); } else { //否则标识此区间结束,新建立一个区间 ans.add(new Interval(min, max)); min = intervals.get(i).start; max = intervals.get(i).end; } } ans.add(new Interval(min, max)); return ans; } }
2.你怎么定义什么是线程安全?
妈呀好抽象、答的不好
3、生产者消费者模型。例如消费者取数据,怎么保证安全?加锁,通知?PV操作?吧啦吧啦。
4、进程与线程的区别。
5、进程间通讯的方式、进程调度方式
后面那个题最搞笑,我说我忘了,调度方式只记得一个轮询,高一学的。面试官:高一,你学的好真早(笑声)。我连忙解释大一
6、了解RPC吗?PRC是怎么样的一个过程。
7、计算机网络 三次握手
我说完后他问我发起一个连接怎么发?提示首先建一个socket,这题没答上来
8、输入一个网站结果哪些过程
9、说一下快速排序的思想、说一下堆排序的思想。
10、A*算法,
10.1、解释算法怎么实现。
这个我是最吃惊的,没想到会问这个。
10.2 、如果我不是1*1的单元格,是2*2怎么做。
我不会,面试官说可以把每个单元格都换成2*2的
11、单例设计模式,手撕。
public class SingleTon { volatile private static SingleTon singleTon = null; private SingleTon(){ System.out.println("实例化1次"); } public static SingleTon getInstance(){ /** *解释:当A与B同时调用getSingleton时,判断第一个if都为空,这时A拿到锁,进行第二层if判断,条件成立new了一个对象; B在外层等待,A创建完成,释放锁,B拿到锁,进行第二层if判断,条件不成立,结束释放锁。C调用getSingleton时第一层判断不成立,直接拿到singleton对象返回,避免进入锁,减少性能开销。 ———————————————— 版权声明:本文为CSDN博主「小韩同志」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/jlnu0812407/article/details/102836187 */ if (singleTon == null){ synchronized (SingleTon.class){ if (singleTon == null) { singleTon = new SingleTon(); } } } return singleTon; } public static void main(String[] args) { for (int i = 0; i < 2; i++) { new Thread(() -> { SingleTon.getInstance(); }, String.valueOf(i)).start(); } } }
12、让我手撕写图的遍历,我确实没记,我说我不会。
提到最短路径算法,我也不会
13、我说我可以写数的遍历吗,行。
import java.util.Stack; /** * @Description: 非递归压栈,实现深度优先遍历 */ public class Soultion2 { public static void dfsWithStack(Node root){ if (root == null) { return; } Stack<Node> stack = new Stack<>(); stack.push(root); while (!stack.isEmpty()){ Node treeNode = stack.pop(); /** * @Description: 处理当前节点 */ System.out.println(treeNode.value); if (treeNode.right != null) { stack.push(treeNode.right); } if (treeNode.left != null) { stack.push(treeNode.left); } } } }
14、场景题目:用户改名字、给新名字和旧名字两个字符串。根据改动名字的多少收费。
我的思路:字符串窗口滑动
思路二:用KMP算法比较新名字是不是包含旧名字,KMP?真的适用吗?吧啦吧啦。。。kmp时间复杂度?
15、深入拷贝与浅拷贝,有啥区别?
我没说到要点,面试官提示:深拷贝出来的对象和浅拷贝出来的对象,我对他们的改变有什么不一样?
说一下深浅拷贝各自的使用场景