一次阿里笔试

一次阿里笔试时间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)


相关推荐

  • 鸿蒙二部曲之一,网文封神之作,“鸿蒙二部曲”和“斗罗四部曲”你选择站哪边?…

    鸿蒙二部曲之一,网文封神之作,“鸿蒙二部曲”和“斗罗四部曲”你选择站哪边?…谈到网络小说,绕不过的就是辰东的“遮天三部曲”、酒徒的“隋唐三部曲”、西红柿的“鸿蒙二部曲”、冰清玉洁唐三少的“斗罗四部曲”了。当然还有其他的许许多多的小说也是同样精彩的。“鸿蒙二部曲”首先我们一起看一下我吃西红柿的“鸿蒙二部曲”,在我吃西红柿的创作里面的《盘龙》和《星辰变》,里面的主角林雷和秦羽最后都是成了鸿蒙掌控者级别的人物。每次说到鸿蒙二部曲的时候,总有些人会说为什么没有《吞噬星空》的罗峰啊…

  • 【APP UI 设计模式】(一)APP UI 设计原则和流程

    【APP UI 设计模式】(一)APP UI 设计原则和流程

  • Android ConstraintLayout布局详解[通俗易懂]

    Android ConstraintLayout布局详解[通俗易懂]前言之前在使用AndroidStudio新建项目的时候,发现MainActivity的默认布局从RelativeLayout变成了ConstraintLayout。当时就对这个ConstraintLayout很好奇,就研究了一下。发觉确实很强大,在此做个总结。ConstraintLayout定义什么是ConstraintLayout呢?ConstraintLayout是Google在2016年的

  • EasyPlayer实现视频的局部缩放、平移功能(类似快手视频)「建议收藏」

    EasyPlayer实现视频的局部缩放、平移功能(类似快手视频)「建议收藏」EasyPlayer实现视频的局部缩放、平移功能(类似快手视频)在预览图片的时候,利用手势控制图片的缩放、平移,已经是智能手机时代最基本的操作。而对于视频,很少有播放器支持这样的操作。实际上,在观看视频的时候,我们可能会想观看某个区域的局部细节,需要把该区域放大来观看,EasyPlayer播放器基于这样的需求,提供了局部放大的功能。感谢github上开源库PhotoView,它在ImageView

  • 时滞模型的matlab编程_adams多体动力学仿真视频

    时滞模型的matlab编程_adams多体动力学仿真视频Matlab仿真含时滞多智体一致性分析,附代码系统结构如下图所示:clear;clc;%2014_多智能体网络的一致性问题研究_纪良浩%此为Paper中的示例代码%例2.1:A=[0,0,0.1,0,0;0.1,0,0,0,0;0,0.15,0,0,0;0,0.25,0,0,0;0.2,0,0,0,0;];D=[0,0,0,0,0;

  • redux-saga_pub culture

    redux-saga_pub culture本文用以记录从调研ReduxSaga,到应用到项目中的一些收获。什么是ReduxSaga官网解释来自:https://github.com/redux-saga/redux-sagaredux-sagaisalibrarythataimstomakesideeffects(i.e.asynchronousthingslikedatafetchingand…

发表回复

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

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