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

时间:2018-10-09 17:52:28

标签: javascript arrays algorithm pseudocode mutable

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

示例:

数组:

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

应成为:

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

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

任何可以解决这些限制的伪代码或真实编程语言解决方案都是很好的。

2 个答案:

答案 0 :(得分:1)

您可以在常规索引i旁边进行迭代数组,在另一个索引此处l进行保留,以保留最后一个有效字符的最新索引。如果实际上没有空间或最后一个索引处没有可用空间,那么将发生值的移位并增加最后一个索引。

在数组内部增加索引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);

答案 1 :(得分:0)

您可以为此在字符串上使用regexp替换;

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