我需要创建一个函数来检查第一个字符串中是否存在两个字符串数组的第二个字符串中的所有字母。我写的函数似乎适用于我尝试过的大多数例子,但是[“hello”,“hey”]返回true,尽管没有你好的问候,我不明白为什么。
这是我的代码:
function mutation(arr) {
arr[0] =arr[0].toUpperCase().split("");
arr[1] =arr[1].toUpperCase().split("");
for(i=0;i<arr[1].length;i++){
if(arr[0].indexOf(arr[1][i])>=0){
return true;
} else {return false;}}}
mutation(["hello", "Hey"]);
答案 0 :(得分:1)
即使匹配一个字符,您也会返回true,请尝试以下代码检查所有字符是否存在
function mutation(arr) {
arr[0] = arr[0].toUpperCase().split("");
arr[1] = arr[1].toUpperCase().split("");
var count = 0;
for (i = 0; i < arr[1].length; i++) {
if (arr[0].indexOf(arr[1][i]) >= 0) {
count++;
}
}
return count === arr[1].length
}
mutation(["hello", "Hey"]);
答案 1 :(得分:0)
这是一个更有效的解决方案,它只适用于小写字母。
(function(){
function charCode(str, i){
return str.charCodeAt(i) - 97;
}
function isMutation(a,b){
const aArr = new Uint8Array(26);
const bArr = new Uint8Array(26);
let i=0;
let index = 0;
while(i<a.length){
++aArr[charCode(a, i)];
++i;
}
i = 0;
while(i<b.length){
++bArr[charCode(b, i)];
++i;
}
i = 0;
while(i < 26){
if(!(aArr[i]===0 && bArr[i]===0 || aArr[i]>0 && bArr[i]>0)){
return false
}
++i;
}
return true;
}
console.assert(isMutation('hello', 'oleh') === true);
console.assert(isMutation('hello', 'hey') === false);
})();
&#13;
你也可以比较两个数组中uniq字符的总和,但在这种情况下你只需要添加每个字母一次。
答案 2 :(得分:0)
我建议使用用户georg在Remove Duplicates from JavaScript Array建议的代码解决方案之一。
例如,下面的函数可用于对每个数组(arr[0] and arr[1])
进行排序并删除重复项。
在上面的链接中记入用户georg。
function uniq(a) {
return a.sort().filter(function(item, pos, ary) {
return !pos || item != ary[pos - 1];
})
}
排序/删除重复项后,您可以测试两个返回的字符串是否相等。
Hello =&gt; EHLO,嘿=&gt; EHY
EHLO!== EHY