请求受访者手动将字符串解析为int的原因是什么?

Geo*_*pty 9 javascript string integer type-conversion

我想知道,请求受访者手动将字符串解析为int的原因是什么?(不依赖于可能内置于该语言中的任何转换/类型转换).这是一个标准问题,从书籍或清单或其他什么建议?

在接受采访时,SO上的其他人是否有人问过这个问题?我想我在解释它并在白板上涂鸦时钉了它,因为我收到了暂定的工作机会:)

下面是我在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;
}
Run Code Online (Sandbox Code Playgroud)

Jör*_*tag 13

我也没有被问过这个问题.

乍一看,似乎其中一个"尽可能早地除去明显无能的白痴,以避免浪费宝贵的采访时间"类型的问题.

但如果你仔细观察它,那里实际上有一些非常有趣的东西.所以,如果是那个这个问题的人,这就是我要找的东西:

  • 这个问题显然是愚蠢的,因为ECMAScript标准库中已经一个功能就是这样.我希望受访者告诉我这个问题很愚蠢,因为否则他们要么是a)无意识的僵尸愚蠢地遵循脑orders命令而不是吸引他们的大脑,或者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);
}
Run Code Online (Sandbox Code Playgroud)

这是一个简单的递归下降解析器,它可以动态地构建值:

"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;
}
Run Code Online (Sandbox Code Playgroud)

就像这种面试问题一样,没有人会认真地希望受访者只是在白板上写下这些功能.特别是递归下降解析器.但恕我直言,任何人都应该能够勾勒出这个功能的样子.特别是,递归下降解析器的一个优点是它是一个非上下文语法直接转换为一组解析函数,受访者应该能够大致解释转换是如何工作的,以及一种解析函数对应于什么样的语法结构.


,这是一个很多的东西,你可以走出这样一个简单的问题!


Geo*_*pty -2

根据其他答案的轶事证据,我会自己回答这个问题,并接受相同的观点:这似乎不是一个“罐装”面试问题。