Javascript 这个递归函数是二次时间复杂度吗?
下面代码的目的是获取连续的重复字符并移动它们,使它们不再重复。i、 e.:“aaabbcc”->“abcacba”如果不可能,则返回NoneJavascript 这个递归函数是二次时间复杂度吗?,javascript,algorithm,data-structures,Javascript,Algorithm,Data Structures,下面代码的目的是获取连续的重复字符并移动它们,使它们不再重复。i、 e.:“aaabbcc”->“abcacba”如果不可能,则返回None function sortEvo(str, result) { result = result || [] str = str.split('').sort() if (str.length === 0) return result.join('') co
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()使它在数组中迭代以重新索引元素。对于线性时间复杂性,您可以使用一个对象来为数组保留
索引
在循环中检查索引中是否存在字符,如果不存在,则为目标数组创建一个或递增索引。然后将此字符添加到目标数组中
最后返回平坦和合并的数组
函数最大距离(字符串){
var指数={},
部分=[];
for(字符串的常数c){
如果(索引中的c)索引[c]+;
else指数[c]=0;
设i=指数[c];
如果(!parts[i])parts[i]=[];
第[i]部分。推(c);
}
返回零件。展开()。连接(“”);
}
log(maxDistance('aaabbcc'))
对于线性时间复杂度,您可以使用一个对象来保存数组的索引
在循环中检查索引中是否存在字符,如果不存在,则为目标数组创建一个或递增索引。然后将此字符添加到目标数组中
最后返回平坦和合并的数组
函数最大距离(字符串){
var指数={},
部分=[];
for(字符串的常数c){
如果(索引中的c)索引[c]+;
else指数[c]=0;
设i=指数[c];
如果(!parts[i])parts[i]=[];
第[i]部分。推(c);
}
返回零件。展开()。连接(“”);
}
log(maxDistance('aaabbcc'))代码>移位
,取消移位
?是的,也许,也许。没关系str.split(“”).sort()
和str.join(“”)
肯定有线性运行时(或者在sort
的情况下更糟),这使得整个sortEvo
运行时是二次的。我留下了一个答案,但仔细检查您的问题可能并不是您想要的。你能帮我查一下吗,这样我就可以编辑了?很有意义,谢谢@Bergi为什么不从开始和结束使用两个索引,并省略对给定数据的变异?@NinaScholz你能给我举个例子吗?shift
,unshift
?是的,也许,也许。没关系str.split(“”).sort()
和str.join(“”)
肯定有线性运行时(或者在sort
的情况下更糟),这使得整个sortEvo
运行时是二次的。我留下了一个答案,但仔细检查您的问题可能并不是您想要的。你能帮我查一下吗,这样我就可以编辑了?很有意义,谢谢@Bergi为什么不从开始和结束使用两个索引,并省略对给定数据的变异?@NinaScholz,你能给我举个例子吗?好主意,但它没有涵盖太多边缘情况,仍然让我印象深刻!很棒的主意,但它并没有涵盖太多的边缘情况,仍然给我留下深刻印象!