使功能更高效

时间:2017-06-16 13:35:08

标签: javascript

我目前正在尝试完成代码挑战以获得乐趣。这是场景。

如果function scramble(str1,str2)个字符的一部分可以重新排列以匹配true,则写str1,返回str2,否则返回false

例如:
str1'rkqodlw'str2'world',输出应返回true
str1'cedewaraaossoqqyt'str2'codewars'应返回true
str1'katas'str2'steak'应返回false

我写的函数有效,但需要很长时间才能执行所有可能的测试。如何让我的功能更高效?提前谢谢。

这是我写的函数:

function scramble(str1, str2) {
  for (var i = 0; i < str1.length; i++) {
    str2 = str2.replace(str1.charAt(i),'');
  }
  return str2.length == 0 ? true : false;
}

1 个答案:

答案 0 :(得分:1)

我现在要尝试编写代码,但也许不同的approch可以给出有趣的结果。 基本上我的想法是:

  • 创建一个空对象
  • 开始循环通过str2:获取当前字母,是新创建的 对象有一个名为“当前字母”的属性,增加值 属性由一个,或者添加到该项目的属性“当前 字母“有价值1。
  • 现在对于对象的每个属性,如果在str1中,则计算该字母是否有 至少与财产价值一样多的事件

以下是代码:

let lettersCounter = new Object();
for (let i = 0; i < str2.length; i++) {
    if (typeof lettersCounter[str2[i]] !== 'undefined'){
        lettersCounter[str2[i]] ++;
    } else {
        lettersCounter[str2[i]] = 1;
    }
}
let props = Object.keys(lettersCounter);
for (let i = 0; i < props.length; i ++){
    let currLetter = props[i];
    if ((str1.split(currLetter).length) <= lettersCounter[currLetter] ){
        return false;
    }
}
return true;

我认为这里真正的弱点是str1.split - 使用正则表达式可能会更快 - 但我讨厌写正则表达式,所以我要把它留给你:)

哦,正如一些人在评论中写的那样,你应该做一些初始化检查,比如str1 === str2和str2.length&lt; = str1.length