问题描述
如果我有类似的东西
function aclean(arr) {
let results = new Map();
arr.forEach((word) => {
const lc = word.toLowerCase().split('').sort().join('');
if (!results.has(lc)) results.set(lc,word);
});
return Array.from(results.values());
}
哪个单词由单词组成,并通过按字母顺序对单词进行排序,将其存储为Map键并存储未排序的单词(它找到的第一个)作为其值,然后继续进行字谜过滤。然后,它返回一个Map值数组。
因此,对于['bat,'tab','bike'],它将返回['bat,'bike'],因为'bat'是找到的'bat'的首个字谜,因此'tab'被删除。
对于这个功能,我在我的假设中是正确的:
-
arr.forEach为N-每个单词被访问一次。
-然后进入循环
-
toLowerCase是〜C,因为每个字符都被访问一次并转换
-
拆分为C
-
排序是〜C Log(C),假设是快速排序
在访问每个字符并将其添加到新数组时, -
join仍为C。
-外循环
-
results.has和.set是常量
-
Array.from(results.values())为R,因为每个值都将在Map中访问并推入新数组。
所以总的来说,我有N *(很多C + C .. + C Log(C)... + C)+ R 简化为N * C Log(C)+ R-其中C是最大的字符串长度?
我假设我可以取消R,因为它的影响将远小于其他两个术语?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)