Javascript 如何在线性时间中追加字符串

Javascript 如何在线性时间中追加字符串,javascript,string,concatenation,big-o,Javascript,String,Concatenation,Big O,我想将在字符组之间随机放置破折号的字符串更改为在n个字符组之间放置破折号的字符串。我想把它保持在O(n)时间复杂度的最坏情况下。下面的soln是有效的,但我相信字符串连接是缓慢的,为了保持O(n),我更喜欢一个恒定的时间操作 //所需字符串为15-678435-555339 设s=“1-5678-43-5555-339” 让newString=“” 设计数器=0 设n=6 如果(s.length==1 | | s.length=0;i--){ 如果(计数器==6){ 计数器=0; 新闻字符串=“

我想将在字符组之间随机放置破折号的字符串更改为在n个字符组之间放置破折号的字符串。我想把它保持在O(n)时间复杂度的最坏情况下。下面的soln是有效的,但我相信字符串连接是缓慢的,为了保持O(n),我更喜欢一个恒定的时间操作

//所需字符串为15-678435-555339
设s=“1-5678-43-5555-339”
让newString=“”
设计数器=0
设n=6
如果(s.length==1 | | s.length=0;i--){
如果(计数器==6){
计数器=0;
新闻字符串=“-”+新闻字符串
}
如果(s.charAt(i)!=“-”){
计数器+=1
newString=s.charAt(i)+newString
}
} 

不确定您使用的是哪种语言,但大多数都有StringBuilder的一些概念,它只是作为下面字符串的ArrayList实现的,当您请求生成的字符串时,通常通过toString()方法连接起来

下面是一个Java示例:

publicstaticvoidmain(字符串[]args){
字符串s=“1-5678-43-5555-339”;
StringBuilder sb=新的StringBuilder();
int DASHORCE=2;
整数计数=0;
char[]ch=s.toCharArray();
for(int i=0;i
不确定您使用的是哪种语言,但大多数都有StringBuilder的一些概念,它只是作为下面字符串的ArrayList实现的,当您请求生成的字符串时,通常通过toString()方法连接起来

下面是一个Java示例:

publicstaticvoidmain(字符串[]args){
字符串s=“1-5678-43-5555-339”;
StringBuilder sb=新的StringBuilder();
int-dashPosition=2;
整数计数=0;
char[]ch=s.toCharArray();
for(int i=0;i
由于这是javascript,您通常可以用最少的代码获得性能最好的解决方案,即:

function* chunk(iterable, size) {
  for(let i = iterable.length; i >= 0; i -= size)
    yield iterable.slice(Math.max(0, i - size), i);
}

let result = [...chunk(s.replace(/-/g, ""), 6)].reverse().join("-");
(但这只是猜测,这在很大程度上取决于发动机)


嗯,我认为字符串concat是昂贵的,使其远远高于o(n)


通常是的,但是一些非常强大的内联可能会将其优化掉。

由于这是javascript,您通常可以用最少的代码获得最高效的解决方案,这将是:

function* chunk(iterable, size) {
  for(let i = iterable.length; i >= 0; i -= size)
    yield iterable.slice(Math.max(0, i - size), i);
}

let result = [...chunk(s.replace(/-/g, ""), 6)].reverse().join("-");
(但这只是猜测,这在很大程度上取决于发动机)


嗯,我认为字符串concat是昂贵的,使其远远高于o(n)


通常是的,但是一些非常强大的内联可能会将其优化掉。

如果这是一个实际问题,而不是带有任意约束的作业,那么您应该将字符串连接起来。在现代javascript上,尤其是对于像您这样的短字符串,这在正常情况下不会出现性能问题


如果确实希望最小化创建的字符串数量,可以使用.charCodeAt(i),然后使用s=String.fromCharCode.apply(null,arrayOfIntegers)构造一个整数字符码数组。但是这不是你通常必须做的事情。

如果这是一个现实生活中的问题,而不是带有任意约束的家庭作业,你应该将字符串连接起来。在现代javascript上,尤其是对于像您这样的短字符串,这在正常情况下不会出现性能问题


如果确实希望最小化创建的字符串数量,可以使用.charCodeAt(i),然后使用s=String.fromCharCode.apply(null,arrayOfIntegers)构造一个整数字符码数组。但这不是你通常必须做的事情。

在O(n)以下你不能做这件事。我是说最坏的情况O(n)!!修正了。这不是你的代码在做的吗?那是O(n)?!嗯,我认为字符串concat是昂贵的,使其远远高于o(n)。没有?我想我没有真正分析字符串前置操作——我只是认为它很糟糕。我选择了反向来简化这个具体的问题,在这里我们做2-6-6。否则它可能会更复杂。你不能在O(n)以下做这件事,我是说最坏的情况O(n)!!修正了。这不是你的代码在做的吗?那是O(n)?!嗯,我认为字符串concat是昂贵的,使其远远高于o(n)。没有?我想我没有真正分析字符串前置操作——我只是认为它很糟糕。我选择了反向来简化这个具体的问题,在这里我们做2-6-6。否则它可能会更复杂。这是一个简单/中等的编码挑战。他们中的许多人需要至少了解Big-O备忘单和哈希表技巧。这是一个要求o(n)soln的问题。这是一个简单/中等的编码挑战。他们中的许多人需要至少了解Big-O备忘单和哈希表技巧。这是其中一个请求o(n)soln的函数。我将数据输入到您的函数,但结果不正确。显然,您的答案使用了生成器解决方案,值得一看,但您是否测试了它?我应该把它放在我的代码里什么地方?是的,有一些错误,应该是。现在我真的对基准感兴趣,看看优秀的。我将研究基准测试。然而,现在我想知道我是如何在futu中为o(n)解决这个问题的
function* chunk(iterable, size) {
  for(let i = iterable.length; i >= 0; i -= size)
    yield iterable.slice(Math.max(0, i - size), i);
}

let result = [...chunk(s.replace(/-/g, ""), 6)].reverse().join("-");