我正在尝试创建一个正和负整数数组,表示距离北和南一个位置 - 我需要以 zigzag 顺序查看数组的元素。
这意味着最大成员首先出现,最小成员出现在第二位,其余元素在较大成员之间交替显示最大和较小成员从最小增加。
即。阵列[1,3,6,9,-3]变为[9,-3,6,1,3]。
我正在尝试完成函数wiggleArrangeArray
,它接受一个参数,一个n个整数的整数数组。
我不知道怎么说
“如果数组中的项目大于数组中的其他项目,则首先显示它。”
“如果项目小于数组中的其他项目,则显示第二项。”
“然后在下一个最大数字和下一个最小数字之间交替”
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()
答案 0 :(得分:3)
注意您提供的算法 计算某种曲折,但不是您正在寻找的曲折。为了将来参考,我将把它留在这里。
在您提供的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实现示例。
示例:
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")