大家好,又见面了,我是你们的朋友全栈君。
时间
2020年2月5日
主题
阿里一面:笔试/代码面
时长
一个小时
前置条件
已经历电话面试,约定好笔试时间
其它
社招、在线笔试
结果
通过
题目类型
并发、很简单的算法题
题目及当时自己提交的答案
1、(JDK1.8)线程A打印a,线程B打印l,线程C打印i,三个线程交替打印,各打印102次,alialiali……
public class ThreadPrint {
private static volatile int integer = 0;
private static String[] strs = {"a", "l", "i"};
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
new Thread(new Print(strs[i], i)).start();
}
}
static class Print implements Runnable {
String content;
int order;
public Print(String content, int order) {
this.content = content;
this.order = order;
}
@Override
public void run() {
for (int i = 0; i < 102; ) {
synchronized (ThreadPrint.class) {
if (integer == order) {
System.out.print(content);
integer = (integer + 1) % strs.length;
i++;
}
}
}
}
}
}
// 使用wait notify
public class ThreadPrint2 {
private static String[] strs = {"a", "l", "i"};
private static String[] plocks = {"i", "a", "l"};
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
new Thread(new Print(strs[i], plocks[i])).start();
}
}
static class Print implements Runnable {
String content;
String plock;
public Print(String content, String plock) {
this.content = content;
this.plock = plock;
}
@Override
public void run() {
for (int i = 0; i < 102; i++) {
synchronized (plock) {
synchronized (content) {
System.out.print(content);
content.notify();
}
try {
plock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
2、小b有一个计数器,其计数规则如下:
-计数从1开始,每过1秒数字+1
-第一次计数周期上限值为5,下一次计数周期上限值为上一次计数周期的两倍
-每次计数到上限值,触发计数重置,即下一个计数重新从1开始
以下是前20秒计数器上显示的数字举例:
1 2 3 4 5 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5
请实现一个方法,输入第n秒,返回计数器上这个时刻的数字
举例1:
输入:1
输出:1
举例2:
输入:15
输出:10
public class Counter {
/**
* @param n 第n秒
* @return 计数器上这个时刻的数字
*/
public int count(int n) {
int limit = 5;
int count = 0;
for (int i = 0; i < n; i++) {
if (count++ == limit) {
count = 1;
limit <<= 1;
}
}
return count;
}
public static void main(String[] args) {
Counter counter = new Counter();
for (int i = 1; i < 50; i++) {
System.out.print(counter.count(i) + " ");
}
}
}
过程说明
在线笔试,过程很轻松,面试官在快要开始的时间前,会发送一个链接,打开之后是笔试页面,大概样子就跟上面的代码块一样,孤零零的两道题,中间有部分留白贴答案用的。可以打开自己本地的IDE,写完之后粘贴上去就行。当时知道是这样子的时候, 我是惊呆了,真的很随意。
要求是1个小时,准备好开始的时候,在页面的聊天窗口那里发送消息给告诉面试官准备开始了,然后1个小时后面试官会打来电话,并聊一下写的代码、解决思路什么的。
当然了看到笔试过程的时候,我是惊呆了,很随意。如果不是还有个视频监控,我都在怀疑会不会有人作弊。
我更呆的是,当我看到题目的时候。出的题也好随意:看起来真的很简单那种,get不到考察的问题点
聊一下我的做题过程:
第1题,看题目第一想法考并发、线程安全的问题。我上面写了两种解法,最开始的时候,想写的是第2种解法,因为脑海里有印象见过类似的题型。尴尬的是,脑子抽了,把wait和notify的同步条件忘了,写完之后发现写的代码不对,思考了一会,没想起来,时间已经过去10多分钟了,我觉得为一道题浪费这么多时间不值得。想了个很Low的解法,就是第一种写法:有a、l、i 共3条线程,竞争到资源的时候,满足条件打印出来就是了。
然后开始看第2题,很简单的算法题,题目已经说的很清楚了,不知道该说什么,不说了。
结果发现时间还有20分钟,然后干脆翻看了下jdk的wait和notify的源码注释,继续调试第1题的第2种写法,调试正确,答案也贴上去了,发现还不到1个小时,就又等了会。顺便说下,第2种写法用的两个字符串数组对象,但是它们引用的字符串字面值都是常量池的同一个变量,所以同步块的条件没有问题。
1个小时后,面试官要了个电话,聊了下思路,因为解法很多,又问了点别的,聊的过程很快,这次笔试就结束了。
随后便会收到邮件将这次笔试题和答案发送过来。
个人感悟
感觉这次笔试考察的是编码规范及并发吧。
开心的是,从题目来看,不是特别针对算法题考察,什么动态规划、贪心、回溯、bfs、dfs什么得一堆有的没的,因为我真得不擅长这些个呀。而比较遗憾的也是,竟然真的没出这些算法题,虽然我不会,但我真的想试试,哈哈。
p.s. 今晚清邮件的时候发现这个笔试邮件,做一记录。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/142191.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...