前言
大家对手写笔试题有什么看法?在互联网发达和大型模型盛行的当下,许多人或许更倾向于采用直接拿来主义,即使用已有的工具和库解决问题,而不亲自手写代码。然而,对于笔试题,一些技术大牛也会感到困扰。
特别是对于那些已经处于管理层的人来说,已经很少亲自编写代码了。
当然从面试者的角度,需要找个基础相对好的人才,手写代码的面试题也是一个不错的选人方案。
下面将分享群友提供的某司原版面试题,供大家参考。

程序员笔试题
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<int> RandNum(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;
}
}
测试结果如下图:
第二种方式
要实现这个需求,我们可以先创建一个长度为 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;
}
}
测试结果如下图:

结语
从这三道笔试题可以看出,面试官出的题还是比较妙。第一题主要考察 C#基础,第二题考察理解实际业务的能力和业务相关设计能力,第三题考察个人的逻辑思维能力。
从试题的难度来说应该是中高级的一面。如果纯写代码的话第二题比较有难度,并且比较费时间。
以上解答仅供参考,可以根据面试官口述的实际场景去作答,如要在面试中得心应手,还需不断提升自己,而不是看几道面试题能解决问题的。
希望本文对你的面试有所帮助,你遇到这类面试题吗?欢迎留言或者吐槽本文。
转自:翔星
链接:mp.weixin.qq.com/s/O1dVI04-TShH4TFO8XS_tA
