当前位置: 首页 > 科技观察

遇到两道笔试题:求连续区间

时间:2023-03-19 15:16:02 科技观察

最近除了准备华为面试,也在面试其他公司。每轮面试都会有几道笔试题。这些笔试题难免有雷同的题型。最近遇到两道类似题型,都是针对连续区间的。虽然不是算法题,但还是很考验逻辑能力的,所以本文就来梳理一下。下面是正题,大家有什么想法可以看看,就当这是面试吧??。第一个输入是1,2,3,5,7,8,10输出要求是1~357~810第二个是将48位时间位图格式化成字符串要求:写一个函数timeBitmapToRanges,将以下规则描述的时间位图转换为选定时间间隔的数组。规则说明:将一天24小时分成每半小时48段。我们用位图来表示选择的时间间隔,比如1100000000000000000000000000000000000000000000000,表示选择前半小时和后半小时,其余时间间隔选择。如果不勾选,则对应00:00~01:00的时间间隔。一张位图中可以选择多个不连续的时间段,例如11001000000000000000000000000000000000000000000,表示选择了00:00-1:00和02:00-02:30两个时间段。示例输入:"1100100000000000000000000000000000000000000000000"示例输出:["00:00~01:00","02:00~02:30"]第一题的解输入是1,2,3,5,7,8,10输出要求是1~357~810这道题显然需要一个连续的区间然后格式化成字符串。当arr[i+1]为arr[i]+1时,是连续的,需要进一步查找。否则,到达区间的边界,只记录区间的起始位置。我们遍历数组并将区间推入数组]};continuousRanges.push(range);index++;}}但是如果中间有连续的数字,需要调整区间的末尾:functioncalcContinuousRanges(arr){letcontinuousRanges=[];letindex=0;while(index{returnstart===end?start:`${start}~${end}`;})。加入('');完整代码如下:index{returnstart===end?start:`${start}~${end}`;}).join('');console.log(格式化);}calcContinuousRanges([1,2,3,5,7,8,10]);总结这道题的思路是先找到连续区间,然后格式化输出连续区间就是判断arr[i+1]和arr[i]的关系,如果连续,index++继续往下查找,直到找到区间的末尾第二题解将48位时间位图格式化为字符串要求:写一个函数timeBitmapToRanges,将如下规则描述的时间位图转换为选定时间区间的数组。规则说明:将一天24小时分成每半小时48段。我们用位图来表示选择的时间间隔,比如1100000000000000000000000000000000000000000000000,表示选择前半小时和后半小时,其余时间间隔选择。如果不勾选,则对应00:00~01:00的时间间隔。一张位图中可以选择多个不连续的时间段,例如11001000000000000000000000000000000000000000000,表示选择了00:00-1:00和02:00-02:30两个时间段。示例输入:"1100100000000000000000000000000000000000000000000"示例输出:["00:00~01:00","02:00~02:30"]这道题也是一道连续区间题。先遍历时间位图,找出所有连续时间段的区间,然后格式化成时间格式输出。对于连续的区间,如果当前位为1,则记录区间的开始,并保持index++寻找区间的末尾,直到不为1,再记录下一个连续的区间。这样,遍历一次后,就找到了所有的连续区间。只需在格式化为时间的字符串中找到模式。让我们编写代码。先找到连续的区间,如果是0,继续,如果是1,记录区间的开始,然后找到区间的结束,然后记录连续的区间:functiontimeBitmapToRanges(timeBitmap){letindex=0;letranges=[];while(index{letstr=0;returnformat(range.start*0.5)+'~'+format(range.end*0.5+0.5);});然后,格式化实现分为两部分:小时和分钟:小时为整数部分,个位数必须补0;分钟是小数部分,只有30和0。functionformat(num){constleft=Math.floor(num);constleftStr=left<10?'0'+left:left;constright=num%1===0.5?30:0;constrightStr=right<10?'0'+right:right;returnleftStr+':'+rightStr;}经过测试,结果正确:完整代码如下:functiontimeBitmapToRanges(timeBitmap){letindex=0;letranges=[];while(index{letstr=0;returnformat(range.start*0.5)+'~'+format(range.end*0.5+0.5);});}functionformat(num){constleft=Math.floor(num);constleftStr=left<10?'0'+left:left;constright=num%1===0.5?30:0;constrightStr=right<10?'0'+right:right;returnleftStr+':'+rightStr;}console.log(timeBitmapToRanges('110010000000000000000000000000000000000000000000'))总结这道题也是求连续区间然后格式化输出的思路,但是连续interval是根据当前位是否为1来判断的,格式化的方式也比较复杂。关于连续区间的题是我最近遇到两次的笔试题。虽然有很多变形,连续区间的判断和格式化方法不同,但是思路是一样的。首先,找到连续区间,然后格式化它。输出。