繁体   English   中英

在Javascript数组中查找最长的单词

[英]Find longest word in Javascript array

因此,我正在解决此Codility编码挑战,而我无法使代码适用于所有输入,尤其是大型输入。 规则在这里

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

对于示例输入-“ 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, // eg 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 = /[az]/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找出匹配的数量,但是这很麻烦:您必须用空字符串替换所有匹配的内容,这会使代码的意图有些混乱。

您已经有了答案,为什么您的方法无法按预期工作。
所以我想我可以通过多个.filter()步骤添加稍微不同的方法

 function findLongestWord(input) { const isAlphaNumericOnly = /^[a-z0-9]+$/i; const numbersOnly = /\\d/g; const alphaOnly = /[az]/gi; const validWords = input.split(/\\s/) .filter(word => isAlphaNumericOnly.test(word)) .filter(word => (word.match(numbersOnly) || []).length % 2 === 1) .filter(word => (word.match(alphaOnly) || []).length % 2 === 0) .sort((a, b) => b.length - a.length); return { word: validWords[0], length: validWords[0] ? validWords[0].length : -1 }; } console.log(findLongestWord("test 5 a0A pass007 ?xy1")); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM