javascript - 为什么我的 JavaScript 对于这个 Scrambles 任务来说太慢了?
问题描述
我正在尝试解决以下任务:
完成函数 scramble(str1, str2),如果 str1 字符的一部分可以重新排列以匹配 str2,则返回 true,否则返回 false。
我编写的代码通过了初始测试,但在最终尝试中失败并出现以下错误:“执行超时(12000 毫秒)”。这里有什么问题?
function scramble(str1, str2) {
let array1 = str1.split("").sort();
let array2 = str2.split("").sort();
let count = 0;
for(let a = 0; a <= array1.length && count < array2.length; a++) {
if(array2[count] === array1[a]){
count++;
}
}
return (count === array2.length);
}
解决方案
您的代码没有任何问题,只是通过最后一个测试太慢了。
代码中最慢的部分是排序。通过创建一个在单字符键下具有该字符数量的对象(例如,“Hello world”变为{"H": 1, "e": 1, "l": 3, "w": 1, "o": 2, "r": 1, "d": 1}
. 您可以使用此“单线”功能在 O(n) 中做到这一点,您可以轻松地不进行排序:
function getCharFrequencies(str) {
return str.split("").reduce(
function(container, char) {
(container[char] += 1) || (container[char] = 1);
return container;
},
{});
}
然后,您可以将每个字符串传递给该函数,并将所有字符频率str2
与频率进行比较str1
,看看您是否可以str2
从str1
.
推荐阅读
- excel - VBA 替换 Sendkeys 以在打印设置中选择选项
- odata - 如何在 SAPUI5 应用程序的断点处查看 OData 实体发布有效负载
- oracle - SQL*Loader 在将数据加载到单列时跳过第一个字符
- php - 使用 PHP SHA512 和 Salt 更改 Filezilla 用户密码
- sql - 提取sql中两个字符之间的字符串
- c# - 验证器代码更改未反映在调试运行中,未命中断点
- android - 为什么我的 ArrayList 没有正确填充?
- tensorflow - TFLearn 无法正确加载带有形状的训练数据
- c++ - 当不存在这样的构造函数时,将类传递给构造函数。为什么它有效?
- angularjs - 带有 UI Bootstrap 的 AngularJS - 单击导航项时自动折叠菜单