javascript - 查找 Javascript 数组中最长的单词

标签 javascript arrays

所以我正在解决这个 codility 编码挑战,但我无法让代码适用于所有输入,尤其是大输入。其规则是 here

总而言之,我需要测试字符串中的每个单词:仅限字母数字字符、偶数个字母和奇数个数字。

对于示例输入 - “test 5 a0A pass007 ?xy1”,此解决方案有效地忽略“test”(它具有偶数位,0 位)和“?xy1”(特殊字符,?)。从剩下的选项中,它选择 pass007 作为最长的单词并返回 7(单词长度)。

我首先将字符串拆分为单独的单词,然后生成 if 语句来检查新数组中的每个单词是否满足要求,isAlpha、isAlphaEven(偶数字母余数 0)、isNumeric(奇数余数 1) )。

知道我做错了什么吗?非常感谢! :)

 // you can write to stdout for debugging purposes, 
 // e.g. console.log('this is a debug message');

function solution(S) {
// write your code in JavaScript (Node.js 8.9.4)
// you can write to stdout for debugging purposes, 
// e.g. console.log('this is a debug message');
// write your code in JavaScript (Node.js 8.9.4)
var words = S.split(" "); 
var isAlpha = /^[0-9a-zA-z]*$/; 
var isAlphaEven = /^[a-zA-Z]/;
var isNumeric = /^[0-9]/; 
var maxLength = -1;

for(var i = 0; i <= words.length - 1; i++) { 
    if(words[i].match(isAlpha) 
    && words[i].replace(isAlphaEven, '').length % 2 == 0
    && words[i].replace(isNumeric, '').length % 2 == 1
    || words[i].match(isNumeric)
    ) {
        maxLength = Math.max(maxLength, words[i].length);
        //console.log(words[i], maxLength);
    }
}

 return maxLength; 
}

最佳答案

一个问题是模式

var isAlphaEven = /^[a-zA-Z]/;
var isNumeric = /^[0-9]/; 

只能匹配字符串开头的字符:^ 锚定到开头。它也不是全局匹配,因此它只会替换一个字符。另一个问题是您用空字符串替换匹配项,而不是测试匹配项的数量。要测试匹配的数量,请使用 .match 和全局标志,并检查结果数组的长度(如果没有匹配则为 null):

function solution(S) {
  // write your code in JavaScript (Node.js 8.9.4)
  // you can write to stdout for debugging purposes, 
  // e.g. console.log('this is a debug message');
  // write your code in JavaScript (Node.js 8.9.4)
  var words = S.split(" ");
  var allAlphaNumeric = /^[\da-z]*$/i;
  var alpha = /[a-z]/gi;
  var numeric = /\d/g;
  var maxLength = -1;

  for (var i = 0; i <= words.length - 1; i++) {
    if (words[i].match(allAlphaNumeric) &&
      (words[i].match(alpha) || []).length % 2 == 0 &&
      (words[i].match(numeric) || []).length % 2 == 1
    ) {
      maxLength = Math.max(maxLength, words[i].length);
    }
  }

  return maxLength;
}

console.log(solution("test 5 a0A pass007 ?xy1"));

请注意,您可以使用不区分大小写的标志来代替重复 a-zA-Z,并且可以使用 \d 代替 [0- 9]如果你愿意的话。

虽然您可以使用 .replace 来计算匹配的数量,但它会很复杂:您必须替换所有匹配的内容空字符串,这会使代码的意图有些困惑。

关于javascript - 查找 Javascript 数组中最长的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57766003/

相关文章:

java - 如何从一串数字中获取数值?

jquery - 将数组项 append 到具有相应索引的 DOM 元素 (jQuery)

数组:在一些附加条件下找到两个数字,使其总和最大

javascript - Q Promise 中的错误处理

javascript - 我如何检查一个对象是否未定义(javascript)?

C - 双字符数组解析 - 要解析的 int 似乎无缘无故地修改了自己

C++ 多维数组索引

javascript - React-select 未在请求负载中发送

javascript - 开 Jest - 语法错误 : Unexpected identifier

javascript - 同一个网站分别使用Edge CSS3动画