在给定索引之间反转数组

时间:2017-07-13 06:55:41

标签: python algorithm

我被问到一个面试问题来反转阵列。我使用了以下方法,它按预期工作:

def reverse(array, i, j):
  if i > j: # ensure i <= j
    i, j = j, i
  while i < j:
    array[i], array[j] = array[j], array[i]
    i += 1
    j -= 1 

现在,面试官要我用for替换上面的while循环,我真的很困惑。请有人帮帮我。提前谢谢。

4 个答案:

答案 0 :(得分:3)

这不是for,但你也可以这样做:

如果你遵循python逻辑,其中[i:j]表示i&lt; = x&lt; j然后你可以这样做:

array[i:j] = array[j-1:i-1:-1]

其他方式,如果您想获得i&lt; = x&lt; = j的元素,那么您可以像@darksky建议的那样:

array[i:j+1] = array[j: i - 1: -1]

答案 1 :(得分:1)

此处的其他答案以非常智能的方式执行此操作,但for循环应如下所示:

for x in range(j - i):
    array[i+x], array[j-x] = array[j-x], array[i+x]

答案 2 :(得分:1)

您可以完全忘记for循环,并执行以下操作:

def reverse(array, i, j):
    # Make sure i is less than j
    if i > j:
        i, j = j, i
    # Reverse array[i:j+1]
    section = array[i:j+1]
    section.reverse()
    array[i:j+1] = section

j+1是为了与您的功能行为保持一致; ij都被视为包容性,但Python需要[包含,独占]。)

或者如果你想保持for循环并避免使用标准函数,那么你可以这样做:

def reverse(array, i, j):
    # Make sure i is less than j
    if i > j:
        i, j = j, i
    # Reverse array[i:j]
    count = j - i + 1
    for offset in range(0, count // 2):
        first = i + offset
        second = j - offset
        array[first], array[second] = array[second], array[first]

答案 3 :(得分:0)

我认为更可读的例子是:

   expected: nil
        got: #<RegularPrice id: 2, label: nil, currency: "CHF", selling_price: 200.0, priceable_type: "Service", p...ated_at: "2017-07-13 08:08:47", quantity: 1, type: "RegularPrice", position: 1, purchase_price: nil>