我如何找到数组的补码?

时间:2015-03-04 23:29:51

标签: arrays

如果我有一个排序的数值数组,例如DoubleIntegerTime,找到补码的一般逻辑是什么?

在我大学的CS职业生涯中,我更了解范围的补充和边缘情况。当我写这篇文章的过程中,当我帮助那些技能水平和理解与我相匹配的学生时,我需要帮助找到一种将这个概念传达给他们的通用方法,用于单数元素和范围。

5 个答案:

答案 0 :(得分:1)

尝试这样的事情:

def complement(l, universe=None):
    """
    Return the complement of a list of integers, as compared to
    a given "universe" set. If no universe is specified,
    consider the universe to be all integers between
    the minimum and maximum values of the given list.
    """
    if universe is not None:
        universe = set(universe)
    else:
        universe = set(range(min(l), max(l)+1))
    return sorted(universe - set(l))

然后

l =  [1,3,5,7,10]
complement(l)

的产率:

[2, 4, 6, 8, 9]

或者您可以指定自己的Universe:

complement(l, range(12))

的产率:

[0, 2, 4, 6, 8, 9, 11]

答案 1 :(得分:0)

您可以使用列表推导找到两个列表的补码。在这里,我们将对x集合y进行补充:

>>> x = [1, 3, 5, 7, 10]
>>> y = [1, 2, 3, 4, 8, 9, 20]
>>> z = [n for n in x if not n in y]
>>> z
[5, 7, 10]
>>>

答案 2 :(得分:0)

添加另一个选项 - 使用对于这些类型的操作总是有用的数据类型。

a = set([1, 3, 5, 7, 10])
b = set(range(1, 11))
c = sorted(list(b.symmetric_difference(a)))
print(c)

[2, 4, 6, 8, 9]

答案 3 :(得分:0)

>>> nums = [1, 3, 5, 7, 10]
>>> [n + ((n&1)*2-1) for n in nums]
[2, 4, 6, 8, 9]

答案 4 :(得分:0)

最简单的方法是从列表的开头迭代到第二个到最后一个元素。设置j等于index + 1。虽然j小于列表中的下一个数字,但请将其附加到补充列表中并递增。

# find the skipped numbers in a list sorted in ascending order
def getSkippedNumbers (arr):
    complement = []
    for i in xrange(0, len(arr) - 1):
        j = arr[i] + 1
        while j < arr[i + 1]:
            complement.append(j)
            j += 1
    return complement

test = [1, 3, 5, 7, 10]
print getSkippedNumbers(test) # returns [2, 4, 6, 8, 9]