错误地返回true

Improperly return true

本文关键字:true 返回 错误      更新时间:2023-09-26

Coderbyte Challenge 7

有人能帮忙吗?下面的函数应该检查字符串中的每个字母是否都有"+"和两边,并在字母不受+约束时返回true和false。但是当我把下面的字符串通过时,它会通过true,而它应该是false,因为k在右手边没有+。提前谢谢。

str = '+f+++l+k=+'
alpha = 'abcdefghijklmnopqrstuvwxyz'
function SimpleSymbols(str) {
  str = str.toLowerCase()
  for (i=0 ; i<str.length ; i++)  {
    if (alpha.indexOf(str.charAt(i)) > 0 && i === 0)  {
        return false 
    }
    else if (alpha.indexOf(str.charAt(str.length -1)) > 0) {
        return false 
    }
     else  if (alpha.indexOf(str.charAt(i)) > 0 && 
        (str.charAt(i-1) !== '+' || str.charAt(i+1) != '+')) {
         return false
    }
     else {return true}    
   }       
}

您的函数每次在第一次迭代时都会中断for循环。您只需要中断false分支上的循环。然后简单地在for循环之后返回true(这意味着直到那一行它才与false一起退出。

作为替代解决方案:

你可以利用这个逻辑:

计算字母数和两边有+的字母数。如果两者相等,则返回true else false

function SimpleSymbols(str) {
   return str.match(/[a-z]/gi).length == str.match(/'+[a-z]'+/g).length
}

这个简单的逻辑怎么样

str = '+f+++l+k++'
function SimpleSymbols(str) {
  str = str.toLowerCase()
  for (i=0 ; i<str.length ; i++)  {
      if (str[i] === '+') {
          continue;
      }
      if (i === 0 || i === str.length - 1) {
          return false;
      }
      if (str[i - 1] === '+' && str[i].match(/[a-z]/) && str[i + 1] === '+') {
          i += 1;
          continue;
      } else {return false;}
  } 
  return true;
}

Fiddle

如果我们开始讨论替代方案,尽管Regex解决方案要短得多,但带有string.split的版本可读性要高得多:

function SimpleSymbols(str){
     if(str.length === 0) return false;
     if(str[0] !== '+' || str[str.length-1] !== '+') return false;
     var subs = str.split('+');
     for(var i =0; i < subs.length; i++){
          if(subs.length > 1) return false;
     }
     return true;
}