一次阿里笔试

一次阿里笔试时间2020年2月5日主题阿里一面:笔试/代码面时长一个小时前置条件已经历电话面试,约定好笔试时间其它社招、在线笔试结果通过题目类型并发、很简单的算法题题目及当时自己提交的答案1、(JDK1.8)线程A打印a,线程B打印l,线程C打印i,三个线程交替打印,各打印102次,alialiali……publicclassThreadP…

大家好,又见面了,我是你们的朋友全栈君。

时间

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账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号