转载

阿里秋招内推

没想到阿里过了两天就在上班时间打过来了。 推到了当晚下班6点,结果等了一个晚上都没打过来。以为晾凉了。 第二天早上11点左右打过来了。打着撸。。。马上丢下游戏,关闭声音,接起了电话。

你好,请介绍一下你自己,巴拉巴拉。主要强调在打算法竞赛。 然后,自己扯到了自己的三个项目,并表示前两个项目没什么好讲的,技术比较水,主要是现在在写的第三个项目。

你主要写java吧,那我问你几个java的问题。

  • java通常用的数据结构有什么。 list, map, set。通常是这三个,但是主要是在集合类里,他们都有许多的实现的子类,比如ArrayList,LinkedList,HashMap,HashTable等。HashMap和HashTable虽然实现差不多,但是线程安全上是不一样的。 # 故意把话题扯过去。
  • 那你了解过线程和进程吗? # 套路成功 巴拉巴拉,但是突然脑子抽了,感觉这里答得不太好,最后还是圆回去了。
  • 那你知道线程,进程,协程的区别吗? emmm,java中没有协程,自己用到协程的地方主要是python,用yield和yiled from关键字进行,主要是生成器的作用,3.6之后好像用asycn和await关键字来代替了。 也不知道答得对不对。反正感觉讲起来挺真的。。
  • 那创建线程的方法有什么呢 实现Thread类,实现Runnable接口,实现Callable接口
  • 有接触过网络编程这一块吗。 网络编程主要了解是c++去编写的吧。自己最近在写的就是用websocket在设计方案。
  • gc垃圾回收机制了解过吗。
  • 堆和栈讲一下 请问所说的是jvm的堆和栈还是数据结构的呢。妥妥的让我解释了数据结构的。

那你有了解过网络编程吗

  • 网络编程比较少触碰,通常就是TCP,UDP那块的内容,然后就扯了下通信如何安全,比如像TCP那样的协议,报文比较多,又有三次握手四次挥手那样的操作,有滑动窗口的操作,可以保证他可靠。
  • 那么UDP为什么不安全呢(TCP与UDP区别)。然后他听我扯到了滑动窗口,就问了下滑动窗口。但是我也没细看,也没听清楚他在讲啥呀orz。忽悠过去之后又讲了下三次握手(必备)
  • 那有了解过ARP协议吗(这里可能电话不太好,我听了三四次没听清。。) 噢。那个地址解析协议对吧。协议这方面平时也没怎么接触过,看到过的协议也就那几个。TPC、UDP、HTTP、DNS等。(忘记了这方面的东西,赶快去背背orz)还好他没继续问下去了。

你知道spring吧。(这个。。我听了更多次都听不清原来在讲spring)

  • 你用的版本是那些呢,java版本呢。 印象中spring是5.0,就讲了。用的spring boot是2.0。jdk1.8.5。没有去用java9和java10(好像有坑就没去踩了)。跟他巴拉巴拉的扯了一堆原因,就说8已经够我用了。
  • spring主要是怎样的呢 一个容器,主要是DI(依赖注入)和IOC(控制反转),然后就解释了一波依赖注入和控制反转。
  • 那么依赖注入是怎么进行操作的呢? 在spring boot中不用写那么多配置文件,可以通过一些注解@Value @Resource @Autowired等注解去注入,(然后发现怕问题偏了,就扯回去)。主要的三大方式是,setter注入,构造器注入和接口注入(老本总不能忘了把)
  • 然后又扯了下为什么用spring boot为什么不用springMVC巴拉巴拉,因为配置文件少啊,开心啊。哇哈哈哈。感觉没再问下去挺仁慈的。

杂七杂八

  • 代码版本管理工具。 emmm。脑子抽了答了maven。还在java的边缘没转过来。git,svn现在主要push到gitlab上,可以有私隐空间。
  • 平时在公司工作是什么。巴拉巴拉,当然是看书啦。推公式orz
  • 开发中有没有遇到过什么坑,怎么解决的。

感想

没问到什么docker,k8s,redis,mysql,内存操作那一块的内容,自己还是有点准备的。。因为是因为这是所谓的简历筛选面,比较。。。简单吧,接下去要好好看看自己被问懵逼那一块了。

聊完已经50分钟了,马上让我做了个上机测试。 是一个在线编码环境,本以为应该要在上面敲,敲完第一题之后发现并不能编译。。所以匆匆打开编译器把后面几题秒完了。

题目1:

一段代码中,有注释和代码部分,请用你熟悉的语言 (Java/C++/Golang/Python 都可以),把代码中的注释去除掉。 样例:

/*
hello world demo
*/
#include <stdio.h>
// main begins here
int main()
{
   printf("Hello, World!"); // print out hello world
   return 0;
}
复制代码

答案:

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        boolean mark = false;
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            int len = line.length();
            for (int i = 0; i < len; i++) {
                if (line.charAt(i) == '/' && i + 1 < len && line.charAt(i + 1) == '*') {
                    mark = true;
                } else if (line.charAt(i) == '*' && i + 1 < len && line.charAt(i + 1) == '/') {
                    mark = false;
                    i += 2;
                } else if (line.charAt(i) == '/' && i + 1 < len && line.charAt(i + 1) == '/') {
                    break;
                }
                if (i >= len) {
                    break;
                }
                if (mark) {
                    continue;
                }
                System.out.print(line.charAt(i));
            }
            System.out.println();
        }
        scanner.close();
    }
}
复制代码

题目2:

一个数字不重复且已排好序,但序列有经过轮转改变的数组,如 [2 3 6 8 9 16 25] 可变为 [6 8 9 16 25 2 3],请找到其中最小的元素。 样例: 给出 [6 8 9 16 25 2 3],返回 2

答案:

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] arr = new int[n];
        int ans = 0;
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.nextInt();
            if (i == 0) {
                ans = arr[i];
            } else {
                ans = Math.min(ans, arr[i]);
            }
        }
        // 虽然很想说,读入就能出答案了,且无法优化
        System.out.println(ans);
        // 但是,如果原本就在内存中。。还是可以优化的
        // 这种做法是查找O(logn)的
        System.out.println(find(arr, 0, n - 1));
    }

    public static int find(int[] arr, int l, int r) {
        int mid = l + r >> 1;
        if (arr[l] <= arr[r]) {
            return arr[l];
        }
        if (arr[mid] < arr[l]) {
            return find(arr, l, mid);
        } else {
            return find(arr, mid + 1, r);
        }
    }
}
复制代码

题目3:

两个线程交替打印1-100的整数,一个打印奇数,一个打印偶数,要求输出结果有序。

这道题有考虑过加锁,但是总感觉加锁哪里怪怪的,因为还是阻止不了某一线程跑的更快一点。好像是。。所以妥妥的用了sleep

答案:

public class Main {
    public static void main(String[] args) {
        ThreadFun threadFunOdd = new ThreadFun(1);
        ThreadFun threadFunEven = new ThreadFun(2);
        threadFunOdd.start();
        threadFunEven.start();

    }
}

class ThreadFun extends Thread {
    @Override
    public void run() {
        try {
            while (startNumber <= 100) {
                System.out.println(startNumber);
                startNumber += 2;
                Thread.sleep(startNumber);
            }
        } catch (Exception e) {

        }
    }

    int startNumber;
    ThreadFun(int startNumber) {
        this.startNumber = startNumber;
    }
}

复制代码

哈哈哈,有个大佬吐槽我的sleep。妥妥的更新了代码。用两个锁来解决问题

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time     : 2018/8/13 10:19
# @Author   : QuanQqqqq
# @Site     :
# @File     : main.py
# @Software : PyCharm

import threading


class Custom(threading.Thread):
    def __init__(self, lock1, lock2, start_counter):
        threading.Thread.__init__(self)
        self.lock1 = lock1
        self.lock2 = lock2
        self.start_counter = start_counter

    def run(self):
        while True:
            if self.lock1.acquire():
                self.lock2.release()
                print(self.start_counter)
                self.start_counter += 2
                if self.start_counter > 100:
                    break


if __name__ == '__main__':
    counter_lock1 = threading.Lock()
    counter_lock2 = threading.Lock()
    counter_lock2.acquire()
    c1 = Custom(counter_lock1, counter_lock2, start_counter=1)
    c2 = Custom(counter_lock2, counter_lock1, start_counter=2)
    c1.start()
    c2.start()

复制代码

内推二面

这次二面感觉。。最近状态有点差,准备又不够好orz 一面应该是简历面,面了之后把我的简历丢去了深圳。 打过来的是专门做数据库的一个团队。突然有点慌。会不会数据库考的特别难。。

  • 先自我介绍一下吧
  • 主要在公司里干什么。怎么处理数据的。然后哗啦啦的讲了一堆
  • 学过编译原理吧emmmmm。。 这个我算是面懵逼了。史妈妈教的编译原理基本都忘光了啊。 就记得个有限状态自动机 恍恍惚惚的就忽悠过去了
  • 学过操作系统吗 操作系统中有什么主要的吗,线程和进程,内存管理。。然后其他就不记得了 讲一下进程和线程的区别吧
  • 学过计算机网络吗 讲一下TCP和UDP的区别吧 老套路,三次握手四次挥手,滑动窗口,TCP报文比较多UDP报文比较少,一个可靠和另一个不可靠。应用场景等。
  • 学过计算机算法吗 emmmm。大佬我怕你是没见过简历噢。然后全部排序讲了一次。真的是全部。。 冒泡,选排,快排及其优化,堆排,基尔,桶排,归并,基数 虽然说,最后突然问我又没了解过计数排序。。真没有
  • 了解过数据结构吗 我怕是真的没看简历噢。然后就讲B树,B+树,红黑树(讲红黑树的时候给他讲了下splay。并说红黑树并不是太好)hash表,以及hash表如何解决冲突等
  • java学了挺久啊。然后就开始问java的东西了
  • servlet讲一下流程 servlet我只记得一堆配置。然后就是生命周期。没有其他的了啊
  • spring的流程。 主要AOP IOC。讲了一下bean。没讲bean的生命周期。扯了两句就过去了。
  • 有了解过hibernate吗,是如何操作的。 印象中就创建Session Transaction,然后session执行save,update,delete等操作。主要是面向对象操作的。
  • java中的classpath和path。 一脸懵逼。。说的是配置环境变量吗。然后就扯了jre和jdk
  • java中的static关键字。简单。 为什么他能通过类名.属性/方法直接访问。 。。。
  • java中的final关键字 属性不能重新赋值。 方法不能重写 类不能继承 然后他问我。。就没有什么属性是可以赋值的吗。。突然懵逼,确信说没有不像C++的const
  • socket编程了解过吗 只敢说了解
  • 还有了解过其他java框架吗 jetty和spring cloud
  • 说一说C++和java的区别 java给你的感觉是什么。 举了解释性语言和编译性语言的区别,并说python和java的差别等。
  • 数据库学过吗。说一下ACID 。。。ACID我这次是彻底的跪了。虽然知道原子性、一致性、隔离性、持久性 但是原子性和一致性都记错了。他让我举例子我一下子吹不出来
  • 索引了解过吗。什么时候用B+树什么时候用hash表 没想出来什么时候用。 他最后给我选择。如果查找某一区间的数据用什么。当然B+树啦
  • 编码规范,算法,编程语言之间的关系

面了50分钟,最后还是很客气的问了我工作地点有没有问题。就是没有当场把我拒了。说两个星期内如果还有消息还会跟我联系。。希望不挂吧orz。毕竟第一次阿里。新手保护光环~

emmm总之感觉今天。本身状态就不是很好。再加上面试第一句问了句会编译原理嘛就开始懵逼。。史妈妈,我都找工作了,还是没放过我orz。

接下去还是得要抽空看一看自己准备的资料,太多东西都自以为是了,记得不太清楚了。

原文  https://juejin.im/post/5e9be418f265da47f5179cfe
正文到此结束
Loading...