【发布时间】:2017-01-09 08:25:28
【问题描述】:
我正在尝试解决 Hackerrank 问题New Year Chaos:
可以在页面上找到进一步的解释。例如,将“已交换”队列表示为q,如果q = [2, 1, 5, 3, 4],则所需的交换次数为3:
根据https://www.quora.com/How-can-I-efficiently-compute-the-number-of-swaps-required-by-slow-sorting-methods-like-insertion-sort-and-bubble-sort-to-sort-a-given-array的第一个答案,冒泡排序所需的交换次数等于数组的反转次数。我尝试使用以下 Hackerrank 提交来测试这一点:
#!/bin/python
import sys
T = int(raw_input().strip())
for a0 in xrange(T):
n = int(raw_input().strip())
q = map(int,raw_input().strip().split(' '))
# your code goes here
diff = [x - y for x, y in zip(q, range(1,n+1))]
if any([abs(el) > 2 for el in diff]):
print "Too chaotic"
else:
all_pairs = [(q[i], q[j]) for i in range(n) for j in range(i+1, n)]
inversions = [pair[0] > pair[1] for pair in all_pairs]
print inversions.count(True)
这里也是本地运行的代码版本:
n = 5
q = [2, 1, 5, 3, 4]
diff = [x - y for x, y in zip(q, range(1,n+1))]
if any([abs(el) > 2 for el in diff]):
print "Too chaotic"
else:
all_pairs = [(q[i], q[j]) for i in range(n) for j in range(i+1, n)]
inversion_or_not = [pair[0] > pair[1] for pair in all_pairs]
print inversion_or_not.count(True)
对于给定的测试用例,脚本正确打印数字 3。但是,对于所有其他“隐藏”测试用例,它给出了错误的答案:
我也尝试过实现冒泡排序的提交:
#!/bin/python
import sys
def swaps_bubble_sort(q):
q = list(q) # Make a shallow copy
swaps = 0
swapped = True
while swapped:
swapped = False
for i in range(n-1):
if q[i] > q[i+1]:
q[i], q[i+1] = q[i+1], q[i]
swaps += 1
swapped = True
return swaps
T = int(raw_input().strip())
for a0 in xrange(T):
n = int(raw_input().strip())
q = map(int,raw_input().strip().split(' '))
# your code goes here
diff = [x - y for x, y in zip(q, range(1,n+1))]
if any([abs(el) > 2 for el in diff]):
print "Too chaotic"
else:
print swaps_bubble_sort(q)
但结果相同(失败)。最小交换次数不等于反转次数还是冒泡排序获得的?
【问题讨论】:
-
请不要将文字作为图片发布。
-
尝试生成自己的测试用例。