不正确地返回true

时间:2015-03-05 13:43:56

标签: javascript algorithm

Coderbyte Challenge 7

有人可以帮忙吗?下面的函数应该检查字符串中的字母是否有' +'并且当一封信没有被+限制时,双方都返回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}    
   }       
}

4 个答案:

答案 0 :(得分:5)

每次第一次迭代时,您的函数都会中断for循环。您只需要打破false分支上的循环。然后只需在for循环后返回true(意味着它不会以false退出,直到该行。

答案 1 :(得分:1)

作为替代解决方案:

你可以利用这个逻辑:

计算两边都有+的字母数和字母数。如果他们都相等,请返回true其他false

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

答案 2 :(得分:0)

这个简单的逻辑怎么样

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

答案 3 :(得分:0)

如果我们开始讨论替代方案虽然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;
}