答与微博前端教主在吃饭时讨论到的一道"微软面试题"
加引号是因为我不知道是否真是微软面试题。题目是这样的:
有一车在某无限长公路上行驶,其起始位置和单位时间内速度均为有限大整数(正负不确定), 现有一仪器,在每一时间单位内可以探测1次车是否在指定位置,求一方法能在有限时间内求出车的速度和初始位置。
答曰:
解此题目分为两个步骤,第一个步骤,探测到车一次
第二个步骤,求出车的速度和位移。
先解答第一步骤,
显然,假设车位移为s,速度为v,在时间t时车的位置必定为 s+v*t
现在我在时间t时,可以对<s,v>值做出一次猜测<x,y>,然后探测位置 x+y*t,若这个位置有车,则第一步骤得解,若这个位置无车,则必定说明猜测<x,y>是不正确的,即可以排除解<x,y>
所以现在我们要构造一个序列 <x(t),y(t)>,使得对于任意的<s,v>取值,总有有限大的t使得 <x(t),y(t)> 值为 <s,v>,此问题之几何意义为将平面中的所有点映射到一个序列,下面给出其中一种最容易编程实现的解。(吃饭时我说的是螺旋形映射,但是想来似乎不如菱形映射容易编程实现)
假设s与v绝对值之和为m,则m必定有限,现在可以用以下代码所示算法检测:
var t = 0;
for(var m = 0; m < Infinity; m++) {
for(var x = 0; x <= m; x++) {
var y = m - x;
if(check(x+y*(t++))) {
break;
}
if(check(x+(-y)*(t++))) {
break;
}
if(check((-x)+y*(t++))) {
break;
}
if(check((-x)+(-y)*(t++))) {
break;
}
}
}
//我知道你们看完代码肯定想揍我,没错,前面那一堆废话其实说的就是这么简单的事情......
第二个步骤,
因为第一步骤的假设<x,y>并非位置的必要条件,所以无法反过来得出探测命中车之后<s,v>必定为<x,y>。但是我们知道车的现在位置之后,可以车之速度为x,依0,1,-1,2,-2,3,-3......这样的序列依次猜测,第二次命中即可得到速度v。
由速度又可以算出初始位置s
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库