三道.NET笔试题,难倒了大牛

前言

大家对手写笔试题有什么看法?在互联网发达和大型模型盛行的当下,许多人或许更倾向于采用直接拿来主义,即使用已有的工具和库解决问题,而不亲自手写代码。然而,对于笔试题,一些技术大牛也会感到困扰。

特别是对于那些已经处于管理层的人来说,已经很少亲自编写代码了。

当然从面试者的角度,需要找个基础相对好的人才,手写代码的面试题也是一个不错的选人方案。

下面将分享群友提供的某司原版面试题,供大家参考。

三道.NET 笔试题,难倒了大牛

程序员笔试题

1、请用代码简易写个.net 定时执行任务,除了 timer 还有其他方式吗?

2、请设计一个给客人下发短信的场景(需调短信供应商的接口),在高峰批量发短信时要保证信息的及时性。

3、写一个函数,它的作用是接受一个整数(假设为 length),返回一个数组,数组的长度为 length,数组中的内容为随机的 0 至(length-1)的值,并且不能重复。比如 length 为 5 的话,数组可能是[1,0,3,2,4]

解析

1、请用代码简易写个.NET 定时执行任务,除了 timer 还有其他方式吗?

答:除了 timer 类可以用 Task.Delay,Thread.Sleep 来实现。

Task.Delay 是.NET 中的一个异步等待方法,它允许在一段指定的时间后继续执行异步操作。

Task.Delay 返回一个 Task 对象,该对象表示一个在指定时间间隔后完成的异步操作。从某种意义上可以代替定时任务。

虽然 Thread.Sleep 也有同样的功能,但不推荐在生产环境中使用它,它会导致线程阻塞,这可能影响应用程序的性能和响应性。

补充:Timer 有三种,Form.Timer 的作用于 UI 线程,Timers.Timer,Threading.Timer。

Task.Delay 的使用案例如下:

static async Task Main()
{
    while (true)
    {
        // 在这里写定时执行的任务逻辑
        Console.WriteLine($"定时任务时间: {DateTime.Now}");
        // 延迟一定时间后再次执行
        await Task.Delay(TimeSpan.FromSeconds(5));
    }
}

这道题主要考察对 C#语法的熟悉程度,经验不足的可能会有点难度。

2、请设计一个给客人下发短信的场景(需调短信供应商的接口),在高峰批量发短信时要保证信息的及时性。

答:回答这个题要抓重点,比如题中的关键字:高峰,及时性。

可以针对这两个关键字展开回答。设计一个给客人下发短信的场景时,首先建立异步任务队列来处理短信发送请求,集成短信供应商的 API 实现调用服务。

在高峰时期通过负载均衡技术分发请求到多个处理节点,利用消息队列确保请求的异步可靠处理。实施错误处理和重试机制,添加监控与日志系统进行实时跟踪,同时进行流量控制,遵循短信供应商的限制。

考虑性能优化、缓存机制、安全性措施,以建立一个可靠、高效、可扩展的系统,确保信息在高峰时期的及时性。代码就不列出了。大家自己思考。

3、写一个函数,它的作用是接受一个整数(假设为 length),返回一个数组,数组的长度为 length,数组中的内容为随机的 0 至(length-1)的值,并且不能重复。比如 length 为 5 的话,数组可能是[1,0,3,2,4]

答:这个是考察逻辑思维的算法试题。试题还是比较简单的,主要考察生成不重复随机数。

一种方式

public class Program
{
    static void Main(string[] args)
    {
        //调用
        List<int> b = RandNum(5);
        foreach (var a in b)
        {
            System.Console.WriteLine(a);
        }
    }
    //算法
    private static List<intRandNum(int n)
    {
        List<int> list = new List<int>();
        for (int i = 0; i < n; i++)
        {
            var a = new Random().Next(0, n);
            if (!list.Where(w => w == a).Any())
                list.Add(a);
            else
                i = i - 1;
        }
        return list;
    }
}

测试结果如下图:

三道.NET 笔试题,难倒了大牛

第二种方式

要实现这个需求,我们可以先创建一个长度为 length 的数组,然后对其进行 Fisher-Yates 洗牌算法。这个算法会随机地重新排列数组中的元素,使得每个元素都有相等的可能性出现在任何位置。

以下是使用 C#实现的函数:

public class Program
{
    static void Main(string[] args)
    {
        //调用
        var arr = GenerateUniqueRandomArray(5);
        foreach (var item in arr)
        {
            //输出
            System.Console.WriteLine(item);
        }
    }
    /// <summary>
    /// 生成一个长度为 length 的随机数组,数组中的元素是从 0 到 length - 1 的不重复的随机数。
    /// </summary>
    /// <param name="length"></param>
    /// <returns></returns>
    public static int[] GenerateUniqueRandomArray(int length)
    {
        int[] result = new int[length];
        Random rand = new Random();

        // 创建一个长度为 length 的数组,并填充初始值
        for (int i = 0; i < length; i++)
        {
            result[i] = i;
        }
        // 使用 Fisher-Yates 算法对数组进行洗牌
        for (int i = length - 1; i > 0; i--)
        {
            int j = rand.Next(i + 1); // 产生一个在 [0, i] 之间的随机数
            int temp = result[i];
            result[i] = result[j];
            result[j] = temp;
        }
        return result;
    }
}

测试结果如下图:

三道.NET 笔试题,难倒了大牛

结语

从这三道笔试题可以看出,面试官出的题还是比较妙。第一题主要考察 C#基础,第二题考察理解实际业务的能力和业务相关设计能力,第三题考察个人的逻辑思维能力。

从试题的难度来说应该是中高级的一面。如果纯写代码的话第二题比较有难度,并且比较费时间。

以上解答仅供参考,可以根据面试官口述的实际场景去作答,如要在面试中得心应手,还需不断提升自己,而不是看几道面试题能解决问题的。

希望本文对你的面试有所帮助,你遇到这类面试题吗?欢迎留言或者吐槽本文。

转自:翔星

链接:mp.weixin.qq.com/s/O1dVI04-TShH4TFO8XS_tA

三道.NET 笔试题,难倒了大牛
回复 【关闭】学永久关闭 App 开屏广告
回复 【删除】学自动检测那个微信好友删除、拉黑
回复 【手册】获取 3 万字.NET、C#工程师面试手册
回复 【帮助】获取 100+个常用的 C#帮助类库
回复 【加群】加入 DotNet 学习交流群

© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
图片正在生成中,请稍后...