我没有通过Javascript技术面试,但我不知道为什么

qco9c6ql  于 2023-01-24  发布在  Java
关注(0)|答案(2)|浏览(164)

我只被允许使用谷歌文档写作。
你能告诉我我做错了什么吗?招聘人员不肯回答我为什么不及格
任务1:实现verify(text)函数,验证文本中的括号是否
嵌套正确。你需要考虑三种类型:()、[]、〈〉且仅限于这些类型。
我的回答:

const verify = (text) => {
   const parenthesesStack = []; 
   
  for( let i = 0; i<text.length; i++ ) {
const closingParentheses = parenthesesStack[parenthesesStack.length - 1]
if(text[i] === “(”  || text[i] === “[” || text[i] === “<”  ) {
    parenthesisStack.push(text[i]);
} else if ((closingParentheses === “(” && text[i] === “)”) || (closingParentheses === “[” && text[i] === “]”) || (closingParentheses === “<” && text[i] === “>”) ) {
   parenthesisStack.pop();  
} 
  };

return parenthesesStack.length ? 0 : 1;     
}

任务2:尽可能简化以下实施。如果您还可以在简化过程中提高性能,那就更好了!仅供参考:这段代码超过35行,包含300多个标记,但它可以用5行和60个标记来编写。函数见下页。
// 'a'和'B'是单个字符串

function func2(s, a, b) {
    var match_empty=/^$/ ;
    if (s.match(match_empty)) {
        return -1;
    } 
    var i=s.length-1;
    var aIndex=-1;
    var bIndex=-1;
    while ((aIndex==-1) && (bIndex==-1) && (i>=0)) {
        if (s.substring(i, i+1) == a)
            aIndex=i;
        if (s.substring(i, i+1) == b)
            bIndex=i;
        i--;
    }
    if (aIndex != -1) {
        if (bIndex == -1)
            return aIndex;
        return Math.max(aIndex, bIndex);
    } else {
        if (bIndex != -1)
            return bIndex; 
        return -1;
    }
};

我的回答:

const funcSimplified = (s,a,b) => {
    if(s.match(/^$/)) {
        return -1;    
    } else {
        return Math.max(s.indexOf(a),s.indexOf(b))
    }
}
pu82cl6c

pu82cl6c1#

首先,我会清楚地知道招聘人员问了些什么,大胆地用项目符号指出,并且要明确。
其次,我会让你从第一个“for”语句开始就失败。请看我的注解:

// Bonus - add jsdoc description, example, expected variables for added intention.

 const verify = (text) => {
// verify what? be specific. 

   const parenthesesStack = []; 
   
  for( let i = 0; i<text.length; i++ ) {  
// this could have been a map method or reduce method depending on what you were getting out of it. Rarely is a for loop like this used now unless you need to break out of it for performance reasons. 

const closingParentheses = parenthesesStack[parenthesesStack.length - 1]
// parenthesesStack.length - 1 === -1. 
// parenthesesStack[-1] = undefined

if(text[i] === “(”  || text[i] === “[” || text[i] === “<”  ) {
    parenthesisStack.push(text[i]);

// “ will break. Use "
// would have been more performant and maintainable to create a variable like this:
// const textOutput = text[i]
// if (textOutput === "("  || textOutput === "["  || textOutput === "<") {
 parenthesisStack.push(textOutput)

} else if ((closingParentheses === “(” && text[i] === “)”) || (closingParentheses === “[” && text[i] === “]”) || (closingParentheses === “<” && text[i] === “>”) ) {
   parenthesisStack.pop();  
// There is nothing in parenthesisStack to pop
} 
  };

return parenthesesStack.length ? 0 : 1;   
// Will always be 0.  
}

不完全是你的函数或逻辑的意图在做什么,但它会失败,基于我所看到的。测试它在浏览器或使用typescript操场。你可以写javascript在那里了。

vsikbqxv

vsikbqxv2#

没有招聘人员的反馈很难说。但我可以看出你误解了第二个功能。

func2("mystrs", 's', 'm')          // returns 5
funcSimplified("mystrs", 's', 'm') // returns 3

您将返回Math.max(s.indexOf(a),s.indexOf(b))而不是Math.max(s.lastIndexOf(a), s.lastIndexOf(b))
原始代码从i=len(str) - 1开始,一直减少到0,他们反向阅读字符串。
可能的实现方式是

const lastOccurenceOf = (s,a,b) => {
    // Check for falsyness (undefined, null, or empty string)
    if (!s) return -1;
    // ensure -1 value if search term is empty
    const lastIndexOfA = a ? s.lastIndexOf(a) : -1
    const lastIndexOfB = b ? s.lastIndexOf(b) : -1
    return Math.max(lastIndexOfA, lastIndexOfB)
}

或者是一个更简洁的例子,可以说更糟糕(因为可读性更差)

const lastOccurenceOf = (s,a,b) => {
    const safeStr = s || '';
    return Math.max(safeStr.lastIndexOf(a || undefined), safeStr.lastIndexOf(b || undefined))
}

我使用a || undefined来强制一个空字符串为undefined,因为:

  • "canal".lastIndexOf("") = 5
  • 如果a或B为空,则"canal".lastIndexOf(undefined) = -1原始函数将返回-1

另外,你问过是否允许你使用ES6+语法吗?你得到了一个普通的JS,你用ES6+实现了等价的JS。一些招聘人员有恶意的POV。

相关问题