在解决来自 coderbyte 的 JavaScript 编码挑战时遇到麻烦

Having trouble solving this JavaScript coding challenge from coderbyte

本文关键字:挑战 编码 战时 遇到 麻烦 JavaScript 解决 coderbyte      更新时间:2023-09-26

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

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

以下是我的尝试:

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。

注意:我假设字符串将是小写的...我还没有处理区分大小写的问题,但我想让小写版本正常工作,然后我会让它与大小写无关。

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

我将其解释为:没有字母的前面/后面没有加号以外的字符(包括无(:

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

您可以使用正则表达式:

    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; 
}

这将在第一个被 + 符号包围的成功字母上返回"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;

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

在javascript中使用它,如下所示:

function SimpleSymbols(str) { 
   return !/^[^a-z]*('++[a-z]'++[a-z]?)*[^a-z]*$/i.test(str);
}
export const simpleSymbols = (str) => {
    const arr = str.split('')
    let k = []
    arr.forEach(element => {
        if((/[a-zA-Z]/).test(element)){
            if(arr[arr.indexOf(element)-1]==="+" && arr[arr.indexOf(element)+1]==="+"){
                k.push(1)
            }else{
                k.push(0)
            }
        }
    }); 
    if(k.includes(0)){
        return false
    }else{
        return true
    }
}