阿里巴巴电话一面凉凉经

我是申请的后台开发岗位

4.13的笔试,两道题

1.
第一道题:蚂蚁森林n个小动物,1~n,小动物编号越小能力越强,现在筛选国王,每个小动物都会崇拜别的小动物或者自己,但只会崇拜比自己能力强的小动物。

问每个人最多可以获得多少票。

看牛客的一些大佬说是要用树的遍历,我只会用递归破解,AC90%

import java.util.Scanner;

public class Main {
    static int[] a;
    static int[] ans;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        a = new int[n];
        ans = new int[n];
        for (int i = 0; i < n; i++) {
            int x = sc.nextInt();
            a[i] = x;
        }
        for (int i = 0; i < n; i++) {
            if (a[i]==0) {
                ans[i] = ans[i]+1;
            }else {
                findZero(i);
            }
        }
        for (int i = 0; i < n; i++) {
            System.out.println(ans[i]);
        }

    }

    private static void findZero(int i) {
        if (i > a.length-1 && i < 0) {
            return;
        }
        if (a[i] > i+1) {
            return;
        }
        ans[i]++;
        if (a[a[i]-1] == 0) {
            ans[a[i]-1]++;
            return;
        }else {
            findZero(a[i]-1);
        }
    }
}
 2.

做完第一题我就身下15分钟,第二题读完题目知道是图的路径搜索,但是不会就没做,后来上网查了floyd和Dijkstra(迪杰斯特拉)算法都可以破解,但floyd可能会超时

学了复习了一下Dijkstra(迪杰斯特拉)算法,没了。

4.17晚上电话面试

45分钟电话面试,30分钟说项目把;

没想到一面就疯狂说项目,我说的确实不好,问到我关于dubbo这些,还要些项目中数据传输的问题。

面试官问我的还要关于项目部署的,我接触到的确实只有单体项目,面试官似乎不满意,后面就没完了。

影响深入的几个问题:

1.

单机部署项目,问题很多,版本迭代就要kill进程,有什么问题?你有想过怎么解决好点吗?

后面问了问朋友,生产直接kill是不行的,强制杀死容易出问题,Kill这个操作不是生产操作,最简单就是布完包重启tomcat。就是取代kill操作啊,但还是以前的部署操作。(唉,我确实菜,项目经验确实不够)

2.

你的项目很慢,你应该做什么排查?例如查询一个数据很慢,你会怎么做?

我那时候一开始就说对项目的优化嘛,我直接就说建立索引什么的,我以为他会要我说说索引原理什么嘛,结果她问我怎么确定就是数据库的问题,不是其他的问题,要怎么排查

我确实不知道,后面补充一下:
1.看日志,是不是又哪写地方阻塞,也就是从应用方面排查,结合适当的debug,看哪个地方的取出来的数据不对。

2.jvm线上排查

jps 定位进程号

jstack PID 就会在终端输出我们熟悉的堆栈信息

3.linux

top 查看cpu使用情况,排除其他线程影响该程序执行的可能

单单看到各个进程的CPU使用率和内存使用率

vmstat

展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。——进一步分析

4.

最后才是定位sql这样子的,

用数据库自带索引命令工具排查

追踪慢查询,为什么慢

在多此查询的地方设置索引

当然,索引也不是绝对的优化方法,可能本身的sql是否可以优化

连表过多,对表进行拆分

也可以这么表达:

2.1

可以从应用,数据库,和运行环境分析;可以考虑用户网络环境,然后是应用中的调用链路是否存在问题(循环调用?外部依赖过多?),然后是数据库。有应用监控系统最好不过了,可以比较具体的排查。

2.2

数据库的原因也很多,sql问题,也有可能是数据库本身延时高。

Linux查看一下进程也需要,查看进程排查应用所在环境因素(其他进程对该应用程序的影响)

2.3

而且索引也不是绝对的优化方法,可能本身的sql是否可以优化,如果连表过多,是否可以拆解到应用层做,或是压根表设计不合理

基础知识

3.

类的加载?——》

双亲委派的过程?——》

还问为什么要双亲委派?

我回答了”安全高效“了,就没说了,他就没问了。。。。

补充:
确实是安全,如果没有这种机制,编写了一个java.lang.Object的同名类并放在ClassPath中,程序一跑,多个Object继续加载,就不能保证object的唯一性。

因此,解决就说通过类加载机制。底层是代理模式,对于 Java 核心库的类的加载工作由引导类加载器来统一完成,保证了 Java 应用所使用的都是同一个版本的 Java 核心库的类,是互相兼容的。

4.

三个工厂模式,有什么区别

这块明明很熟悉,面试可能有点紧张说的迷迷糊糊。。。我也不知道有没有说准确

答案:

三个工厂模式,各有千秋

从简单工厂模式——》工厂方法模式,解决了对产品的拓展不符合OCT原则的问题

从工厂方法模式——》抽象工厂模式,解决了一个过程只能生产一个产品的问题

但是反而多了一个问题,就是又产生了部分不符合OCT原则的问题,对工厂的拓展符合OCT,但是没错要拓展一个产品,就要修改一次工厂里面的方法

5.

高并发的concurrenthashmap

推荐使用,
在jdk8之前是使用分段加锁的一个方式,分成16个桶,每次只加锁其中一个桶,而在jdk8又加入了红黑树和CAS算法来实现。
每次只会锁目前一个segment,用synchronized+CAS,效率更高了,并发度更高。

问题:concurrenthashmap,有一个线程进入这一个桶,进行put方法,他还能再进入吗?

妈呀,我竟然说不可以,前面都采用synchronized了,synchronized是可重入锁啊!!!后面纠正过来了,但是。。

6.

spring容器启动过程

spring我配置文件在哪里读取?

我看过,但是一到面试说起来就不全面,缺斤少两的

https://zhuanlan.zhihu.com/p/82136894

总结:

这次面试的不足:

1.复盘项目,我在想对于工作经验这块我还是缺少很多,得总结自己以前遇到的问题以及解决思路,小项目就小项目,但还是得积极拓展,“自己为难自己”

2.复习基础,高并发这块可以再多吃透一点,懂的东西也要深入理解,做到别人怎么问都不怕

3.面试过程容易手忙脚乱的问题,前面回答的不好,后面就应该好好调整。

这次面试才45分钟,应该是凉了,面试官人还是不错的,看到我挺紧张的,也叫我调整调整状态。

加油!争取下次更好

#面经笔经##阿里巴巴#
全部评论
老兄,你的这个编程题存在问题吧,递归中的条件有问题。然后你这个程序运行会出现栈溢出的异常
1 回复 分享
发布于 2020-04-25 11:35
动森??
点赞 回复 分享
发布于 2020-04-18 15:35
多谢楼主的Spring分享
点赞 回复 分享
发布于 2020-04-18 14:51

相关推荐

点赞 评论 收藏
分享
昨天 14:51
已编辑
井冈山大学 算法工程师
龙虾x:算法比你强的没有你美,比你美的…..算了已经没有比你美的了
工作两年想退休了
点赞 评论 收藏
分享
评论
5
42
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务