在不使用额外内存的情况下就地删除数组中的值

时间:2015-06-21 15:53:35

标签: python arrays algorithm dynamic-arrays

我想从数组中删除值x,并且我有以下约束:

  1. 我只能遍历数组
  2. 不允许额外的内存/数据结构
  3. 这样

    a = [1, 2, 'x', 3, 4, 5]
    

    变为

    [1, 2, 3, 4, 5, None]
    

    只有一个x的案例是微不足道的,我只是将所有内容都移到了一个位置:

    def removeSingleElement(value, array):
        i = 0
        while i < len(array)-1:
            if array[i] == value:
                for val in array[i:-1]:
                    array[i] = array[i+1]
                    i += 1 
            else:
                i += 1
    
        array[-1] = None
        return array
    

    但如何处理重复值的数组?

    a = [1, 'x', 2, 3, 'x', 4]

    应该成为

    a = [1, 2, 3, 4, None, None]

    (我的想法是我不能调整数组的大小,所以我想要移动左边的所有内容并用Null的值填充其余部分。)

    免责声明:这不是一个Python问题,我正在寻找通用算法,它恰好发现Python方便表达这个想法;)

4 个答案:

答案 0 :(得分:2)

你需要两个指数,一个用于阅读和写作:

def remove_element(value, array):
    reading_idx = writing_idx = 0
    while reading_idx < len(array):
        if array[reading_idx] != value:
            array[writing_idx] = array[reading_idx]
            writing_idx += 1
        reading_idx += 1
    while writing_idx < len(array):
        array[writing_idx] = None
        writing_idx += 1

答案 1 :(得分:2)

假设您可以提前知道数组的长度并存储计数器,则可以进行以下工作:

def remove_element(value,array):
    shift = 0
    for index in xrange(len(array)):
        try:
            array[index] = array[index + shift]
            while array[index] == value:
                shift += 1
                array[index] = array[index + shift]
        except IndexError:
            array[index] = None

答案 2 :(得分:0)

这可能是作弊,但是......

def remove(value, array):
    try:
        while True:
            del(array[array.index(value)])
            array.append(None)
    except ValueError:
        pass

    return array

答案 3 :(得分:0)

<强>代码:

def removeSingleElement(value, array):
    """
    Remove value from the input array.
    Input parameters:
        value: Remove Value.
        array: Input array.
    Output parameters:
        return array.
    """
    #- Length of array.
    array_length = len(array)
    i = array_length - 1

    #- Iterate Array from higher index to Lower index.
    while i > -1:
        #- Check Current item value with remove value.
        if array[i] == value:
            #- Remove Value from the input list.
            array.pop(i)
            #- Append None value to input list.
            array.append(None)
        #- Decrement index value by 1
        i -= 1

    return array


remove_item = 'x'
input_array = ['x', 1, 2, 3, 'x', 4, 5, 'x']

output_array = removeSingleElement(remove_item, input_array)

print "Output:", output_array

<强>输出:

vivek@vivek:~/Desktop/stackoverflow$ python remove_item.py 
Output: [1, 2, 3, 4, 5, None, None, None]