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