为了账号安全,请及时绑定邮箱和手机立即绑定

这个简单的 ArrayRotation 代码输出错误?

这个简单的 ArrayRotation 代码输出错误?

繁花不似锦 2023-09-19 14:04:50
为左数组旋转编写了一个简单的代码,得到了相同的数组,但没有对其进行任何旋转,作为错误的输出。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] = tempdef 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: 3123Enter the number of rotations: 11 2 3我预计旋转一圈后输出为 2 3 1。
查看完整描述

3 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

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


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])


查看完整回答
反对 回复 2023-09-19
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

在函数 leftRotate 中,

while 循环中有错误。

代替

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

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


查看完整回答
反对 回复 2023-09-19
?
慕姐8265434

TA贡献1813条经验 获得超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) 的回答更加Python化。但它有一个错误,并且与你的问题的方法有所不同。错误在于,当请求的旋转次数高于列表的长度时,它不起作用。不同之处在于他们返回一个新列表而不是修改它。这两个问题可以这样解决:


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]


查看完整回答
反对 回复 2023-09-19
  • 3 回答
  • 0 关注
  • 57 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信