请指出我在这个数据结构实现中的错误

时间:2017-12-29 14:31:13

标签: python arrays python-3.x algorithm data-structures

对大小数组的左旋转操作将每个阵列元素1单元向左移位。例如,如果在数组[1,2,3,4,5]上执行了2次左旋转,则数组将变为[3,4,5,1,2]。

给定一个整数数组和一个数字,在数组上执行左旋转。然后将更新的数组打印为一行以空格分隔的整数。

示例输入: 5,4 1 2 3 4 5 样品输出:5 1 2 3 4 我的输出是:2 2 3 4 1

#!/bin/python3

    import sys

    def leftRotation(a, d):
        #Main Logic here
        length=len(a)
        for j in range(0,d):
            for i in range(0,length):
                temp=a[0]
                a[i]=a[i+1]
                a[length-1]=temp
                return a
            return a
        return a



    if __name__ == "__main__":
        n, d = input().strip().split(' ')
        n, d = [int(n), int(d)]
        a = list(map(int, input().strip().split(' ')))
        result = leftRotation(a, d)
        print (" ".join(map(str, result)))

4 个答案:

答案 0 :(得分:2)

1)返回将停止执行代码,因此代码只会在返回之前循环一次。

2)这些行包含逻辑错误:

temp=a[0]
a[i]=a[i+1]
a[length-1]=temp

要进行左旋转,我们在第一个位置插入最后一个值。您的问题是您在循环内部而不是在外部分配temp = a[0]。您还要重新分配循环中的最后一个值。

修复了所有错误:

def leftRotation(a, d):
    #Main Logic here
    length=len(a)
    for j in range(0,d):
        temp=a[0]
        for i in range(0,length - 1):
            a[i]=a[i+1]
        a[length-1]=temp
    return a

给出正确答案。

(P.S。使用标准list方法进行左旋转的方法更简单:a.append(a.pop(0))。)

答案 1 :(得分:1)

Rassar已经涵盖了代码的问题,我只想使用答案中提到的list方法添加更好的解决方案:

def left_rotation(l, offset):
    offset %= len(l)
    return l[offset:] + l[:offset]

result = left_rotation([1, 2, 3, 4, 5], 12)
print(" ".join(str(item) for item in result))  # 3 4 5 1 2

答案 2 :(得分:1)

其他人已经在您的代码中指出了问题,您也可以使用collections.deque尝试此解决方案:

from collections import deque

def left_rotation(lst, n):
    queue = deque(lst)

    removed = [queue.popleft() for i in range(n)]

    return list(queue) + removed

print(" ".join(map(str, left_rotation([1,2,3,4,5], 2))))

哪个输出:

3 4 5 1 2

注意: popleft()此处为O(1),效率更高pop(0),而O(n)则为import csv import urllib2 url = 'http://winterolympicsmedals.com/medals.csv' response = urllib2.urlopen(url) cr = csv.reader(response) for row in cr: print row

答案 3 :(得分:0)

  1. 首先你的程序没有运行整个(0,d),它在第一次迭代中的结束和左旋转没有完成,因此你的第一和第二个元素具有相同的值

    def leftRotation(a, d):   
        #Main Logic here   
        length=len(a)   
    
        for j in range(0,d):   
            temp=a[0]
            for i in range(0,length):  
            a[i]=a[i+1]   # a[i](i == 0) & a[i+1](i == 1) will have same values
            a[length-1]=temp
            return a    #Because your  program is ending here
    
  2. 即使您的代码运行整个迭代,您也会获得IndexError 你正在运行循环(0,长度),当你的i = length-1 => i + 1 =长度&在列表中,我们仅在列表中将“零”索引为“length-1”

  3. 现在解决了这两个问题之后,这可能有用: -

    def leftRotation(a, d):
        #Main Logic here
        length=len(a)
        for j in range(0,d):
            temp=a[0]
            for i in range(0,length-1):  
                a[i]=a[i+1]
    
            a[length-1]=temp
    
        return a
    

    使用列表切片的更好答案: - 。

    function rotate_list(a,d):   
         return a[d:] + a[d:]