一道简单题带你通过面试第一关

325 阅读3分钟

众所周知啊,面试主要难的都是编程题。而编程题主要考以写函数为主,一般有三道题,难度依次递增。这次我们先来讲最简单的第一题,先稳住一下心态。再进行下面的面试。

实战

话不多说,直接开始实战。

假设题目的要求是:输入一串长度为10的数组,把他转成电话号码的格式,类似于(xxx) xxx-xxxx。我们能怎样做出来呢?

字符串拼接

这是最暴力的一种做法,毕竟面试嘛,我们只要得到结果就可以了,因此我们可以直接用下标就可以了。

function formatPhoneNumber(arr) {
if (arr.length !== 10) {
throw new Error('Array must contain exactly 10 digits');
} 
return "("+arr[0]+arr[1]+arr[2]+") "+arr[3]+arr[4]+arr[5]+"-"+arr[6]+arr[7]+arr[8]+arr[9];
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
console.log(formatPhoneNumber(numbers)); // 输出: (123) 456-7890

但我们得到结果的方式也很重要。用这种方法可以得到我们的答案,但是真的能在面试得到满分吗?或者说,这种用法有什么缺陷?

我们要知道,从数组输入到字符串拼接,这个过程是十分机械化的,灵活性很低。功能我们确实实现了。但还是有许多地方可以优化。

身为一个一流的工程师在完成代码后,是要考虑它的优化的。根据什么标准来进行优化呢? 代码可读性是一个重要的标准。以电话模板来处理,使得更语义化,更好理解。

在上面的字符串拼接是es5时的用法,但此时我们应该使用es6中方法,可以优化我们代码的可读性和维护性。

在es6中我们的代码拼接常用${....}实现,是模板字符串的一部分,允许在字符串中嵌入表达式。这些表达式会被计算然后其结果会转换为字符串,最后整个模板字符串会作为一个完整的字符串返回。

${...}来写,此时我们的代码会变成

 return `(${arr[0]}${arr[1]}${arr[2]}) ${arr[3]}${arr[4]}${arr[5]}-${arr[6]}${arr[7]}${arr[8]}${arr[9]}`;

当然我们还可以用更简洁的,es6才出现的写法。

 return `(${arr.slice(0, 3).join('')}) ${arr.slice(3, 6).join('')}-${arr.slice(6).join('')}`;

对其中slice和join不熟悉的可以翻看这篇作品(JavaScript基础之“数组”),里面详细介绍了一些数组的基本用法。

replace

这是JavaScript中一个强大的方法,可以查找和替换指定的字符串,这题我们也可以用repalce这样解:

function getPhoneNum(arr){
    let format = "(xxx) xxx-xxxx"
    for(let i =0 ;i<arr.length;i++){
        format = format.replace('x',arr[i])
    }
    return format;
}

console.log(getPhoneNum([1,2,3,4,5,6,7,8,9,0]));

用变量状态解决问题,我们要知道电话号码初始状态(xxx) xxx-xxxx,从而用replace方法把x用数字替换掉。当x一个都没有时,完成替换,可以返回了。

结语

一道小小的第一题,你以为面试官已经了解我们的能力。

考验了我们的快速编码能力,是否会es6,怎么提升代码可读性,有没有别的解法等。我们都要回答出来。这样我们才能在面试与别人拉开差距。更不要说现在行业越来越卷,面试稍有不对就会直接挂掉,我们更要学好知识底层。