答与微博前端教主在吃饭时讨论到的一道"微软面试题"

加引号是因为我不知道是否真是微软面试题。题目是这样的:

 

有一车在某无限长公路上行驶,其起始位置和单位时间内速度均为有限大整数(正负不确定), 现有一仪器,在每一时间单位内可以探测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 

 

 

posted @   winter-cn  阅读(4220)  评论(2编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示