一次阿里笔试

时间

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.  今晚清邮件的时候发现这个笔试邮件,做一记录。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不识君的荒漠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值