2017-06-16 55 views
1

我正在尝试完成代码挑战的乐趣。这是场景。使功能更具性能

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; 
} 
+0

你是什么意思“太长” ? 'scramble(“piosdjfpasoidjfkoawmesfjatkjdsngfayksndglkjysngdlkjantokgsdannkogjmaoriewjgaeoirneorijgaeirgwoef”,“hello”)'在我的机器上需要0.06ms –

+0

'return str2.length == 0? true:false;'可以重写'return!str2.length;'。对于(var i = 0,j = str1.length; i

+0

61次测试通过后,由于“完成时间超过12000ms”而出错。 – Josh

回答

1

我要去尝试,现在编写代码,但也许不同的计算策略能给有趣的结果。 基本上我的想法是:

  • 创建一个空的对象
  • 开始通过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 < = str1.length