无法从coderbyte解决这个JavaScript编码挑战

时间:2013-10-01 04:35:06

标签: javascript

我正在尝试从coderbyte.com解决以下问题:

  

使用JavaScript语言,让函数SimpleSymbols(str)获取传递的str参数,并通过返回字符串true或false来确定它是否是可接受的序列。 str参数将由+和=符号组成,它们之间有几个字母(即。++ d + === + c ++ == a),如果字符串为true,则每个字母必须用+符号包围。所以左边的字符串是假的。该字符串不会为空,并且至少有一个字母。

以下是我的尝试:

function SimpleSymbols(str) { 

  // code goes here  
var abc = 'abcdefghijklmnopqrstuvwxyz';

for (var i = 0; i < str.length; i++) {
    if (abc.indexOf(str[i]) !== -1) {
        if (str[i-1] + str[i+1] === "++") {
            return true;
        }
        else {
            return false;
        }
    }
}

}

这适用于以下情况:

SimpleSymbols("+a+d+"); // true 
SimpleSymbols("+ab+d+"); // false
SimpleSymbols("b+d+"); // false

我发现唯一没有提供正确答案的案例是当有一封尾随字母时,例如:

SimpleSymbols("+a+b"); // true

返回true,实际上它应该返回false。

注意:我假设字符串将是小写的...我没有处理区分大小写,但我想让小写版本工作,然后我将使它独立于案例。

关于我的代码有什么问题的任何想法?

4 个答案:

答案 0 :(得分:1)

我将此解释为:除了加号(包括无)之外,没有任何字母前面/之后没有字母:

function SimpleSymbols(str) { 
  return !/^[a-z]|[^+][a-z]|[a-z][^+]|[a-z]$/i.test(str)
}

答案 1 :(得分:0)

在由+符号包围的第一个成功字母上返回'true',它不会继续检查到最后。

我也想知道字符串索引是否会在第一个/最后一个字符上超出范围[i-1][i+1]?它似乎没有,但我找不到语言参考。

更好:

function SimpleSymbols(str) { 
    var abc = 'abcdefghijklmnopqrstuvwxyz';

    for (var i = 0; i < str.length; i++) {
        if (abc.indexOf(str[i]) !== -1) {
            if (str[i-1] + str[i+1] != "++") {
                return false;
            }
        }
    }
    return true;
}

也可能会有性能改进(通过AND检查边界字符而不是字符串添加),你也可以通过正则表达式来完成。

通过正则表达式:

if (str.search( /[^+][a-z]/) >= 0)     // will match letters with no + beforehand.
    return false;
if (str.search( /[a-z][^+]/) >= 0)     // will match letters with no + afterward.
    return false;
return true;

答案 2 :(得分:0)

我相信这是一个完美的正则表达式案例 检查正则表达式^[^a-z]*(\++[a-z]\++[a-z]?)*[^a-z]*$解释in here

在javascript中使用它:

function SimpleSymbols(str) { 
   return !/^[^a-z]*(\++[a-z]\++[a-z]?)*[^a-z]*$/i.test(str);
}

答案 3 :(得分:0)

您可以使用正则表达式:

    function SimpleSymbols(str) { 

      if (/^[a-zA-Z]/.test(str) || /[a-zA-Z]$/.test(str)) {
          return false;
      }
      else if (/[^+][a-zA-Z]/.test(str) || /[a-zA-Z][^+]/.test(str)) {
          return false;
      }
      else {
       return true; 
      }         
    }

function SimpleSymbols(str) { 

  var arr = str.toLowerCase().split("");
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] >= "a" && arr[i] <= "z") {
      if (i === 0 || i === arr.length) {
        return false;
      }

      if (arr[i-1] !== "+" || arr[i+1] !== "+") {
        return false;
      }
    }
  }

  return true; 

}