在这个访问中有没有人在这个问题上问过这个特别的问题?我想我在把它解释出来并把它写在白板上,就像我收到了一个临时工作提供的那样
以下是我在Javascript中的实现.有一些天真的方面(例如它不采用基数参数)到以下,但它演示了(或多或少)正确的算法.
function to_i(strValue) { //named so as to not be confused with parseInt
if (typeof strValue !== 'string' || strValue.length === 0) {
return Number.NaN;
}
var tmpStr = strValue;
var intValue = 0;
var mult = 1;
for (var pos=tmpStr.length-1; pos>=0; pos--) {
var charCode = tmpStr.charCodeAt(pos);
if (charCode < 48 || charCode > 57) {
return Number.NaN;
}
intValue += mult * Math.abs(48-charCode);
tmpStr = tmpStr.substr(0,tmpStr.length-1);
mult *= 10;
}
return intValue;
}
解决方法
乍看起来,似乎其中之一就是尽早把杂乱无章的白痴摆出来,浪费宝贵的面试时间“的问题.
但是,如果你仔细看一下,那里有一些非常有趣的东西.所以,如果我是那个提出这个问题的人,这就是我要找的:
>这个问题显然是愚蠢的,因为ECMAScript标准库中已经有一个功能完全正确.我想让受访者告诉我,这个问题是愚蠢的,因为否则他们是一个无脑的僵尸,愚蠢地遵循脑死亡命令,而不是参与他们的大脑,或者b)他们实际上并不知道那个功能存在.
>这也显然是一个解析问题,有趣的是看到受访者是否将其视为更多的字符串黑客问题或正式解析问题,以及这种方法产生的开销.在这种特殊情况下,我认为字符串黑客是正确的方法,但它仍然导致了一个很好的后续问题:“现在用递归下降解析器做同样的事情”.任何程序员都应该能够在几分钟内勾画此问题的递归下降解析器.
>最后但并非最不重要的是,这显然是字符串的字符.现在,我不一定会期待一个新手程序员自己发现这个折叠,但是如果我暗示有一个折叠,那么他们应该可以自己发现,并以一种折叠的形式重写他们的解决方案.
>当然,你可以判断这种类型的问题允许你的所有一般素质:受访者是否停止并考虑问题,或者他开始劫持.他是否从要求,文档,规范,示例,测试或代码开始.他是否要求澄清角落的情况(就像空字符串发生的情况一样,只包含负号而没有别的字符串会发生什么,空格是保证是格式整齐的字符串的字符串是负零)一个格式正好的整数).他惯常使用ES5的严格子集.他是否编写可读代码他是否编写jslint友好的代码
下面是一个解决问题的例子(在ECMAScript中称为reduce):
"use strict";
function toInteger(s) {
return s.split('').reverse().reduce(function (n,c,i) {
if (c === '-') return -n;
return n + (c.charCodeAt(0) - 48) * Math.pow(10,i);
},0);
}
这是一个简单的递归下降解析器,它可以在运行中建立一个值:
"use strict";
function toInteger(s) {
var input,output = 0,sign = 1,lookahead = function () {
return input.charat(0);
},consume = function () {
var res = input.slice(0,1);
input = input.slice(1,input.length);
return res;
},isDigit = function (c) {
return /[0-9]/.test(c);
},signParser = function () {
if (lookahead() === '-') {
sign *= -1;
consume();
}
},digitParser = function () {
if (!isDigit(lookahead())) return false;
output *= 10;
output += (consume().charCodeAt(0) - 48);
return true;
},numberParser = function () {
signParser();
while (digitParser());
};
input = s;
numberParser();
if (!input.length === 0) return false;
output *= sign;
return output;
}
像这样的面试问题一样,没有人会认真地期待受访者将这些功能写在白板上.特别是递归下降解析器.但是,呃,任何人都应该能够勾画出什么样的功能.特别地,递归下降解析器的一个优点是它是将上下文无关语法直接转换为一组解析函数,受访者应该能够大致解释这种转换是如何工作的,以及什么一种解析函数对应于什么样的语法结构.
嗯,这是很多东西,你可以摆脱这样一个简单的问题!