【问题标题】:Output error in this simple code for ArrayRotation?ArrayRotation 这个简单代码中的输出错误?
【发布时间】:2020-09-29 12:45:54
【问题描述】:

为左数组旋转​​编写了一个简单的代码,得到相同的数组而没有对它进行任何旋转作为错误的输出。

def leftRotate(arr, d, n):
    while (d-1) > 0:
        leftRotatebyOne(arr, n)


def leftRotatebyOne(arr, n):
    temp = arr[0]
    for i in range(n-1):
        arr[i] = arr[i + 1]
    arr[n - 1] = temp


def PrintArray(arr, size):
    for i in range(size):
        print("%d" % arr[i], end=" ")


arr = []
l = int(input("Enter the number of elements: "))
for i in range(0, l):
    ele = int(input())
    arr.append(ele)

d = int(input("Enter the number of rotations: "))
n = len(arr)
leftRotate(arr, d, n)
PrintArray(arr, n)

这是我得到的输出示例,

Enter the number of elements: 3
1
2
3
Enter the number of rotations: 1
1 2 3

我预计旋转一圈后的输出为 2 3 1。

【问题讨论】:

标签: python arrays python-3.x output


【解决方案1】:

我建议使用数组切片,然后将切片添加在一起,以执行旋转。

def left_rotate(data, num):
    return data[num:] + data[:num]

def right_rotate(data, num):
    return data[-num:] + data[:-num]

例如

>>> a = [1,2,3,4,5,6,7]
>>> left_rotate(a, 2)
[3, 4, 5, 6, 7, 1, 2]
>>> right_rotate(a, 2)
[6, 7, 1, 2, 3, 4, 5]

另请注意,collections.deque 已经提供此行为

>>> from collections import deque
>>> d = deque([1,2,3,4,5,6,7])
>>> d.rotate(2)
>>> d
deque([6, 7, 1, 2, 3, 4, 5])
>>> d.rotate(-2)
>>> d
deque([1, 2, 3, 4, 5, 6, 7])

【讨论】:

  • 我可以建议num %= len(data) 以确保在一个步骤中也可以处理多个完整的旋转吗?
  • 脑吹,Tnx
  • @MuhsinMuhammed 只是注意到前两种方法与您提出的方法有所不同,因为它们返回结果而不是内联修改它。他们也有一个错误,如果num > len(data) 他们根本不工作
  • 您可以找到 Cory 的方法,但可以在下面解决这两个问题(感谢 Cory 真正的 Python 方法)
【解决方案2】:

d == 1 时,while (d-1) > 0: 任何时候都不会执行。此外,您永远不会减少 d。最简单的解决方法是使用for _ in range(d) 循环:

def leftRotate(arr, d, n):
    for _ in range(d):
        leftRotatebyOne(arr, n)

注意: Python 有比这更好的方法来进行旋转。这段代码似乎是 C 而不是 Python。例如,在 Python 中传递数组长度是没有意义的。并且轮换可以在一个作业中完成。

def leftRotate(arr, d):
    d %= len(arr)
    for _ in range(d):
        arr[-1], arr[:-1] = arr[0], arr[1:]

Cory Kramer 的回答更加pythonic。但它有一个错误,并且与您的问题方法有所不同。错误是当请求的旋转次数高于列表的长度时它不起作用。不同之处在于他们返回一个新列表而不是修改它。这两个问题可以这样解决:

def left_rotate(data, num):
    num %= len(data)
    data[:] = data[num:] + data[:num]

def right_rotate(data, num):
    num %= len(data)
    data[:] = data[-num:] + data[:-num]

【讨论】:

    【解决方案3】:

    在函数leftRotate中,

    while 循环有错误。

    替换

    while (d-1) > 0:
        leftRotatebyOne(arr, n)
    

    while d > 0:
        leftRotatebyOne(arr, n)
        d -= 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多