1

我在今天的JavaScript技术面试中被问到这个问题,我失败了,但我仍然无法找到解决方案。我提出的问题和解决方案如下。我已经通过了一些测试用例,但代码仍然不能在所有情况下工作。如果有人能帮我有效地解决这个问题,我将不胜感激。


您将得到一个字符串,即输入,由大小写不同的字母组成。

这些字母应根据大小写相互配对。例如,字母“N”按顺序与字母“a”形成“匹配对”。

规则:

  1. 第一个字母必须大写。
  2. 每个大写字母后面都必须跟有小写字母或任何大写字母。
  3. 当大写字母后接小写字母时,这两个字母将被视为“匹配对”,然后可以从进一步的匹配考虑中忽略。
  4. 如果这些规则中的任何一个被打破,或者遇到了一个小写字母,而该字母与其最近的未匹配左邻接字母没有创建“匹配对”,则该字母和后面的所有字母都被视为“未匹配”。

输出:您的方法应该返回最后一个匹配的小写字母的从零开始的索引,如果不存在对,则返回-1。

限制:0<输入长度<10000字符优化方法的运行时间为O(输入长度)。

示例输入#1

阿拉伯联合酋长国

示例输出#1

这是我所做的,但并不适用于每个测试用例;

函数stringMatch(str){let word=str.split(“”)let lastIndex;if(单词[0]===单词[0].toUpperCase()){for(设i=0;i<word.length;i++){if(单词[i]===单词[i].toUpperCase()){if(单词[i].toLowerCase()===单词[i+1]||单词[i+1]===词[i+1].toUpperCase(()){lastIndex=i}其他{返回-1}}其他{lastIndex=i}}返回lastIndex}}
4
  • “在技术面试中”。。。因为这种问题肯定会出现在你的日常工作中……;-) 评论 2018年7月3日19:53
  • @ScottSauyet问题本身并不重要,解决问题的过程证明了创建算法的能力。
    – 巴尔马
    评论 2018年7月3日20:59
  • @巴玛完全同意你的观点。他们在解决问题时检查您的算法和数据结构知识。 评论 2018年7月3日22:56
  • @巴尔马:我只有一半同意。一个好的程序员应该能够展示有趣的算法和有用的数据结构的知识。但在玩具问题中这样做并不能表明她真正掌握了解决现实世界问题所必需的东西。根据我的经验,那些能在白板上解决这些问题的人在团队中的表现并不比那些不能解决的人好。 评论 2018年7月4日1:20

2个答案2

重置为默认值
1

一个很好的方法是使用一个包含大写字母的堆栈。堆栈的下一个元素应该始终是您试图匹配的下一小写。

循环字符串,如果每个字母都是大写的,则将其推到堆栈上并继续。如果是小写,则从堆栈中弹出一个并进行比较。如果它们匹配,则将索引设置为最后匹配的索引并继续,如果它们不匹配,则返回最后匹配的索引号。

常数为上限=(l)=>l===l.至上限()函数findUnmatchedIndex(str){让堆栈=[]让lastMatch=-1for(设i=0;i<str.length;i++){let letter=str[i]if(isUpper(letter)){stack.push(字母);继续;}let next=堆栈.pop()if(next!==letter.toUpperCase())return lastMatchlastMatch=i}return lastMatch}console.log(findUnmatchedIndex('ABba'))console.log(findUnmatchedIndex('ABCcDEedFeGHi'))console.log(findUnmatchedIndex('ABCbDEedFeGHi'))

4
  • 谢谢!这是最佳解决方案吗?这个算法的复杂度是多少?我认为这是线性时间,对吗?如果不是,还有什么办法可以提高效率吗@标记_M 评论 2018年7月3日23:05
  • 1
    @UgurYilmaz我不确定它是否是最佳的,但如果我们假设javascriptarray.push()array.pop()都是恒定时间操作。我看不出我们怎么能比O(n)做得更好,但这很容易出错。
    – 作记号
    评论 2018年7月3日23:13
  • 我理解。我必须补充一点,这是一个非常好的解决方案。与其他解决方案相比,这是最容易理解的解决方案。我希望这个解决方案对我接下来的面试有帮助@标记_M 评论 2018年7月3日23:18
  • @UgurYilmaz很高兴我能帮上忙。祝面试顺利!
    – 作记号
    评论 2018年7月3日23:19
0

如果没有更多的测试用例,我无法确定这一点。但这看起来可能符合要求。

常数为下限=(c)=>“a”<=c&&c<=“z”const final=(stack)=>堆栈[stack.length-1]const initial=(stack)=>stack.slice(0,stack.length-1)const check=(str)=>str.split(“”).reduce(({lastIndex,失败,堆栈},c,idx)=>失败? {lastIndex,failed,stack}//不使用reduce进行此操作的一个原因。:is下部(c)? c===最终(堆叠)? {lastIndex:idx,失败,堆栈:初始(堆栈)}:{lastIndex,失败:true,堆栈}:{lastIndex,失败,堆栈:stack.concat(c.toLowerCase())},{lastIndex:-1,失败:false,堆栈:[]}).last索引console.log(检查('ABba'))

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.