Javascript Codewars混乱(无法通过上一次测试性能问题)

Javascript Codewars混乱(无法通过上一次测试性能问题),javascript,Javascript,请看下面写的代码行。它太慢,无法通过最后一次测试(长字符串)。 在这种情况下,迭代数组中的每个元素是个坏主意吗?这是处理长字符串时导致执行速度减慢的主要原因吗 需要解决的问题如下所述: 完成函数扰码(str1,str2),如果str1字符的一部分可以重新排列以匹配str2,则返回true,否则返回false。 这是问题的关键 function scramble(str1, str2) { let count=0 let targetAry=str2.split('') let strAry

请看下面写的代码行。它太慢,无法通过最后一次测试(长字符串)。 在这种情况下,迭代数组中的每个元素是个坏主意吗?这是处理长字符串时导致执行速度减慢的主要原因吗

需要解决的问题如下所述:

完成函数扰码(str1,str2),如果str1字符的一部分可以重新排列以匹配str2,则返回true,否则返回false。 这是问题的关键

function scramble(str1, str2) {
 let count=0
 let targetAry=str2.split('')
 let strAry=str1.split('')
 for (let i=0;i<targetAry.length;i++){
   for(let j=0;j<strAry.length;j++){
     if(targetAry[i]===strAry[j]){
       strAry.splice(j,1)
       count++
       break
     }
   }
 }
 return (count==targetAry.length)
}
您的算法是
O(n^2)
——对于一个数组中的每个字符,以及另一个数组中的每个字符,您正在执行一个操作。您的
拼接
也弄乱了标记

降低计算复杂度。一种方法是将每个字符串转换为一个具有字符计数的对象

const countStr = (str) => {
    const obj = {};
    for (const char of str) {
        obj[char] = (obj[char] || 0) + 1;
    }
    return obj;
}
const scramble = (str1, str2) => {
    const [obj1, obj2] = [str1, str2].map(countStr);
    return (
        Object.keys(obj1).length === Object.keys(obj2).length &&
        Object.entries(obj1).every(([key, val]) => obj2[key] === val)
    );
};

你想解决的问题是什么?我只是把描述和链接放在上面。抱歉省略了这一部分。FWIW
scramble('abb','ab')
看起来不对……它给出了
false
,我认为这是需要的,因为字母不能重新排列以匹配其他字母,对吗?我稍微更改了你的答案,以便通过测试,并将其包含在我的问题部分。谢谢你的解释。我对Javascript非常陌生,在你提到大O符号之前,我对它一无所知。它为我打开了处理Javascript算法的新大门。
const countStr = (str) => {
    const obj = {};
    for (const char of str) {
        obj[char] = (obj[char] || 0) + 1;
    }
    return obj;
}
const scramble = (str1, str2) => {
    const [obj1, obj2] = [str1, str2].map(countStr);
    return (
        Object.keys(obj1).length === Object.keys(obj2).length &&
        Object.entries(obj1).every(([key, val]) => obj2[key] === val)
    );
};