在Python中创建Zigzag数组的函数

时间:2017-01-19 20:02:22

标签: python arrays function zigzag zigzag-encoding

我正在尝试创建一个整数数组,表示距离一个位置 - 我需要以 zigzag 顺序查看数组的元素。

这意味着最大成员首先出现,最小成员出现在第二位,其余元素在较大成员之间交替显示最大较小成员从最小增加。

即。阵列[1,3,6,9,-3]变为[9,-3,6,1,3]。

我正在尝试完成函数wiggleArrangeArray,它接受​​一个参数,一个n个整数的整数数组。

必需的输入格式,约束和输出格式 enter image description here

我不知道怎么说

“如果数组中的项目大于数组中的其他项目,则首先显示它。”

“如果项目小于数组中的其他项目,则显示第二项。”

“然后在下一个最大数字和下一个最小数字之间交替”

def wiggleArrangeArray(intArr):
    for i in intArr
        #if i > other items in intArr
        #display that i at index value 0
        #if i < other items in intArr
        #display that i at index value 1
        #if i < i at index value 0 and > other items in intArr, display it next
        #if i > i at index value 1 and < other items in intArr, display it next
        #repeat last two lines for continuing values

请尽可能帮助。 Here's a link到C ++中的解决方案,但我需要它在Python中。谢谢。

编辑:该功能需要使用以下测试:

f = open(os.environ["OUTPUT_PATH"], "w")

_intArr_cnt = int(raw_input())
_intArr_i=0
_intARR = []
while _intArr_i < _intArr_cnt:
    _intArr_item = int(raw_input());
    _intArr.append(_intArr_item)
    _intArr_i+=1

res = wiggleArrangeArray(_intArr);
for res_cur in res:
    f.write( str(res_cur) + "\n" )

f.close()

2 个答案:

答案 0 :(得分:3)

更改的C ++代码

  

注意您提供的算法 计算某种曲折,但不是您正在寻找的曲折。为了将来参考,我将把它留在这里。

     

在您提供的C ++代码中,他们只查找满足&lt;的序列。 b> c&lt; d> e&lt; f,你正在寻找一个1-max,1-min,2-max,2-min,...的序列。

您的链接为您提供了一个解决方案,您可以在Python中逐字逐句复制。您只需定义swap函数:

def swap(arr,i,j):
    t = arr[i]
    arr[i] = arr[j]
    arr[j] = t

接下来,您只需修改代码:

def zigZag(arr):
    n = len(arr)
    # Flag true indicates relation "<" is expected,
    # else ">" is expected.  The first expected relation
    # is "<"
    flag = True

    i = 0
    while i<= n-2:
        if (flag):  # "<" relation expected
            # If we have a situation like A > B > C,
            # we get A > B < C by swapping B and C
            if arr[i] > arr[i+1]:
                swap(arr,i,i+1)
        else: # ">" relation expected
            # If we have a situation like A < B < C,
            #  we get A < C > B by swapping B and C
            if arr[i] < arr[i+1]:
                swap(arr,i,i+1)
        flag = not flag # flip flag
        i += 1

请注意,这是 un-Pythonic ,所以你可以简单地改进它:

def swap(arr,i,j):
    arr[i],arr[j] = arr[j],arr[i]

def zigZag(arr):
    n = len(arr)
    for i in range(len(arr)-1):
        if not i&1:
            if arr[i] > arr[i+1]:
                swap(arr,i,i+1)
        elif arr[i] < arr[i+1]:
            swap(arr,i,i+1)
    return arr

这里元组赋值用于交换列表中的元素,range用于迭代索引,我们还可以使用elif代替{在if中{1}},并且我已使用模数检查放弃了else

您的之字形功能

你可以通过对列表进行排序,并使用两个指针来解决问题,每个指针每次都发出最左边,最右边并且相互走向。换句话说就像:

flag

答案 1 :(得分:0)

这里是Python实现示例。

  1. 以相反的顺序(9、6、3、1,-3)对数据进行排序
  2. 由两个列表(9,6)(3,1,-3)分开
  3. 从头开始遍历两个(使用zip_longest),第二个以相反的顺序(9,-3),(6,1)(None,3)
  4. 解压缩由zip_longest(chain(* zip ...))创建的元组,以便获得可迭代的数据(9,-3、6、1,无,3)
  5. 如果列表中元素的数量为奇数(如果x不是None),则删除None值

示例:

from itertools import zip_longest, chain


def zig_zag_array(data):
    data = sorted(data)
    mid = len(data) // 2
    return [
        x for x in chain(*zip_longest(data[mid:][::-1], data[:mid])) if x is not None
    ]

测试:

if __name__ == "__main__":
    data = [1, 3, 6, 9, -3]
    expected = [9, -3, 6, 1, 3]
    output = zig_zag_array(data)
    assert output == expected, f"Odd length: {output=}"

    data = [1, 3, 6, 9, -3, 0]
    expected = [9, -3, 6, 0, 3, 1]
    output = zig_zag_array(data)
    assert output == expected, f"Even length: {output=}"
    print("PASSED")