javascript - 这个递归函数是二次时间复杂度吗?
问题描述
以下代码的目的是获取连续重复的字符并移动它们,使它们不再重复。即:'aaabbcc' -> 'abcacba' 如果不可能,则返回 None。
function sortEvo(str, result) {
result = result || []
str = str.split('').sort()
if (str.length === 0)
return result.join('')
const arrLen = str.length - 1
const resLen = result.length - 1
if (str[arrLen] !== result[resLen])
result.push(str.pop())
else if (str[arrLen] !== result[0])
result.unshift(str.pop())
else if (str[0] !== result[resLen])
result.push(str.shift())
else return 'None'
return sortEvo(str.join(''), result)
}
乍一看,它看起来是线性时间,但我不确定,因为 shift() 和 unshift() 使它遍历数组以重新索引元素。
解决方案
对于线性时间复杂度,您可以indices
为数组数组保留一个对象。
在循环中检查字符是否存在于 中indices
,如果不存在,则创建一个或增加目标数组的索引。然后将此字符添加到目标数组中。
最后返回扁平并连接的数组。
function maxDistance(string) {
var indices = {},
parts = [];
for (const c of string) {
if (c in indices) indices[c]++;
else indices[c] = 0;
let i = indices[c];
if (!parts[i]) parts[i] = [];
parts[i].push(c);
}
return parts.flat().join('');
}
console.log(maxDistance('aaabbcc'));
推荐阅读
- sql - 访问:如何查询直到找到最终父级?
- python - 检测具有模糊边缘和不同背景的卡片边缘
- django - 设置 Django 项目时的 nginx server_name
- python - python lxml在某些情况下无法解析日语
- javascript - 如何在extjs中隐藏GridPanel的列
- java - Java Spring JPA - 字节 [] 到字符串
- c# - 我的测试用例没有执行,它开始执行但没有任何反应,并且显示未运行状态
- boost-test - CTest 和多测试二进制文件
- c# - TSQL 数组初始化和 LINQ Where on Array
- python - 使用 aiohttp 在线程中获取页面 - 得到 Future
连接到不同的循环