javascripty中基于大小写字母的字符串匹配
我在今天的JavaScript技术面试中被问到这个问题,我失败了,但我仍然无法找到解决方案。我提出的问题和解决方案如下。我通过了一些测试用例,但代码仍然不能在任何情况下都工作。如果有人能帮我有效地解决这个问题,我将不胜感激javascripty中基于大小写字母的字符串匹配,javascript,string,Javascript,String,我在今天的JavaScript技术面试中被问到这个问题,我失败了,但我仍然无法找到解决方案。我提出的问题和解决方案如下。我通过了一些测试用例,但代码仍然不能在任何情况下都工作。如果有人能帮我有效地解决这个问题,我将不胜感激 您将获得一个字符串input,由大小写不同的字母组成 这些字母应根据大小写相互配对。例如,字母“N”与字母“a”按该顺序形成“匹配对” 规则: 第一个字母必须是大写 每个大写字母后面都必须跟有其小写版本或任何大写字母 当大写字母后接小写字母时,这两个字母被视为“匹配对”,可
您将获得一个字符串input,由大小写不同的字母组成 这些字母应根据大小写相互配对。例如,字母“N”与字母“a”按该顺序形成“匹配对” 规则:
0
字符最佳方法的运行时间为O(input length)
样本输入#1
样本输出#1
这就是我所做的,但它并不适用于所有测试用例
function stringMatch(str){
let word=str.split("")
let lastIndex;
if (word[0]===word[0].toUpperCase()){
for(let i=0;i<word.length;i++){
if(word[i]===word[i].toUpperCase()){
if(word[i].toLowerCase()===word[i+1] || word[i+1]===word[i+1].toUpperCase() ){
lastIndex=i
}
else{
return -1
}
}
else{
lastIndex=i
}
}
return lastIndex
}
}
函数字符串匹配(str){
让word=str.split(“”)
让最后一个索引;
if(单词[0]==单词[0].toUpperCase()){
对于(假设i=0;i没有更多的测试用例,我对此不确定。但这看起来可能满足要求
const isLower=(c)=>a'stack.slice(0,stack.length-1)
常量检查=(str)=>str.split(“”)。减少(
({lastIndex,failed,stack},c,idx)=>
失败
?{lastIndex,failed,stack}//不使用reduce执行此操作的一个原因。
:岛下(c)
?c==最终(堆栈)
?{lastIndex:idx,失败,堆栈:初始(堆栈)}
:{lastIndex,失败:true,堆栈}
:{lastIndex,失败,堆栈:stack.concat(c.toLowerCase())},
{lastIndex:-1,失败:false,堆栈:[]}
).lastIndex
log(check('ABba'))
一个很好的方法是使用一个包含大写字母的堆栈。堆栈的下一个元素应该始终是您尝试匹配的下一个小写字母
循环遍历字符串,对于每个字母,如果是大写,则将其推到堆栈上并继续。如果是小写,则从堆栈中弹出一个并进行比较。如果匹配,则将索引设置为最后匹配的索引,然后继续;如果不匹配,则返回最后匹配的索引
const isUpper=(l)=>l==l.toUpperCase()
函数findUnmatchedIndex(str){
让堆栈=[]
让lastMatch=-1
for(设i=0;i log(findUnmatchedIndex('ABCbDEedFeGHi'))
“在技术面试中”…因为这种问题肯定会在您的日常工作中出现…;-)@ScottSauyet问题本身并不重要,解决问题的过程证明了创建算法的能力。@Barmar完全同意你的观点。他们在解决问题时检查你的算法和数据结构知识。@Barmar:我只同意一半。一个好的程序员应该能够展示有趣的算法知识ithms和有用的数据结构。但在玩具问题中这样做并不表明她真正掌握了解决现实世界问题的必要条件。根据我的经验,那些能够在白板上解决这些问题的人在团队中的表现并不比那些不能解决的人好。谢谢!这是最佳解决方案吗?复杂性是什么“这个算法是什么?我认为它是线性时间,对吗?如果不是,还有什么可以提高效率的吗?”马克_M@UgurYilmaz我不确定它是否是最优的,但如果我们假设javascript的array.push()和array.pop()是
都是固定时间操作。我不认为我们能比O(n)做得更好,但这很容易出错。我理解。我必须补充一点,这是一个非常好的解决方案。与其他解决方案相比,这是最容易理解的解决方案。我希望这个解决方案对我的下一次面试有所帮助!@Mark_M@UgurYilmaz很高兴我能帮忙。祝面试顺利!
3
function stringMatch(str){
let word=str.split("")
let lastIndex;
if (word[0]===word[0].toUpperCase()){
for(let i=0;i<word.length;i++){
if(word[i]===word[i].toUpperCase()){
if(word[i].toLowerCase()===word[i+1] || word[i+1]===word[i+1].toUpperCase() ){
lastIndex=i
}
else{
return -1
}
}
else{
lastIndex=i
}
}
return lastIndex
}
}