如何在简单数组上实现空间修剪

How to implement space trimming on a simple array

提问人:Ziv Glazer 提问时间:10/10/2018 最后编辑:Nina ScholzZiv Glazer 更新时间:10/10/2018 访问量:50

问:

这更像是一个伪代码问题。 假设我们有一个 char 数组,其中每个值都是字母或空格。我们需要实现的是一种算法,它将任何空间序列替换为单个空间。

例:

数组:

['a', 'b', ' ', ' ', ' ', 'b', 'c', ' ']

应变为:

['a', 'b', ' ', 'b', 'c', ' ']

此算法应仅修改给定数组,而不应在临时数组或类似内容中使用。更改数组的唯一方法是按索引设置项目(不能使用任何花哨的数组函数,例如,只能使用 )。O(n) 中有解吗?arr.remove(0, 2)arr[i] = b

任何回答限制的伪代码或真正的编程语言解决方案都是好的。

JavaScript的 阵 列 算法 伪代码 可变

评论

0赞 10/10/2018
这听起来像是家庭作业。你的尝试在哪里?

答:

0赞 Eugene Tsakh 10/10/2018 #1

为此,您可以在字符串上使用 replace by regexp;

arr.join('').replace(/\s+/g, ' ').split('')

评论

0赞 Ziv Glazer 10/14/2018
此答案不符合问题的要求
1赞 Nina Scholz 10/10/2018 #2

除了用于迭代数组的普通索引之外,还可以使用另一个索引,用于保留最后一个有效字符的最后一个新索引。如果最后一个索引处实际上没有空格或没有空格可用,则值将发生偏移,最后一个索引将增加。il

在数组内部增加索引。i

最后,将数组的长度调整为 。l

 i    l    0  1  2  3  4  5  6  7
--   --   -----------------------
           a  b  _  _  _  b  c  _
 0    0    a
 1    1    a  b
 2    2    a  b  _
 3    2    a  b  _
 4    2    a  b  _
 5    3    a  b  _  b
 6    4    a  b  _  b  c
 7    5    a  b  _  b  c  _

var array = ['a', 'b', ' ', ' ', ' ', 'b', 'c', ' '],
    i = 0,
    l = 0;
    
while (i < array.length) {
    if (array[i] !== ' ' || array[l - 1] !== ' ') {
        array[l] = array[i];
        l++;
    }
    i++;
}

array.length = l;

console.log(array);