面试时应显示什么代码

今天早晨,有一篇非常有趣的文章,关于您在面试中需要编写什么代码以及展示什么技能的知识。 测试任务是这样。

在TypeScript上编写一个函数,对于给定的数字数组,该函数显示范围的文本字符串:

getRanges([0, 1, 2, 3, 4, 7, 8, 10]); // 0-4,7-8,10 getRanges([4, 7, 10]); // 4,7,10 getRanges([2, 3, 8, 9]); // 2-3,8-9 

不幸的是,该帖子不再可用,我将不再恢复给出的解决方案。 但是这个决定是如此美丽,对于在截止日期结束前受到管理层轻微折磨普通程序员而言,其可读性极差。 这几乎是单行的只写Perl风格的脚本。

问题是,如何评估此代码? 一方面,他证明了候选人的高技术水平。 另一方面,它也证明了对具有不同培训水平的程序员的团队开发过程的误解。

我在大约10分钟内草拟了决定。 看起来像这样:

 class Interval { start: number; stop: number constructor(start: number, stop: number) { this.start = start; this.stop = stop; } toString(arr: number[]) { let text: string; text = arr[this.start].toString(); if (this.start < this.stop) { text += '-' + arr[this.stop].toString(); } return text; } } function getRanges(arr: number[]) { // find start-stop intervals in the sequence let intervals : Interval[] = []; let start = 0; for (let i = 1; i < arr.length; i++) { if (arr[i] - arr[i - 1] > 1) { intervals.push(new Interval(start, i - 1)); start = i; } } intervals.push(new Interval(start, arr.length - 1)); // convert intervals to the string let out : String = ""; for (let i = 0; i < intervals.length; i++) { out += intervals[i].toString(arr); if (i < intervals.length - 1) { out += ','; } } console.log(out); } getRanges([0, 1, 2, 3, 4, 7, 8, 10]); // 0-4,7-8,10 getRanges([4, 7, 10]); // 4,7,10 getRanges([2, 3, 8, 9]); // 2-3,8-9 

这里的算法是这样的:

  • 在第一步中,我们从一组数字中选择间隔
  • 在第二步中,我们将间隔转换为字符串

但是后来我看了这个决定。 并非如此,它看起来也很完美。 有点冗长,引入了一个额外的实体“ Interval”。 但我仍然坚信,这个决定更容易阅读和理解。

但这是问题。 从奥林匹克编程迷的角度,如何在采访中评估这个决定?

总的来说,我想继续进行讨论。

UPD 1.任务的补充。 输入数组已排序。
UPD2 。原始帖子再次可用, habr.com/en/post/470407

Source: https://habr.com/ru/post/zh-CN470660/


All Articles