挑战
给定一个非空的整数数组,例如:
[5, 2, 7, 6, 4, 1, 3]
首先将其切断成没有任何项目大于前一个的数组(即非升序数组):
[5, 2] [7, 6, 4, 1] [3]
接下来,反转每个数组:
[2, 5] [1, 4, 6, 7] [3]
最后,将它们全部串联在一起:
[2, 5, 1, 4, 6, 7, 3]
这应该是程序输出/函数返回的结果。重复此过程足够的时间,数组将被完全排序。
规则
- 输入和输出可以通过任何标准方法给出,并且可以采用任何合理的数组格式。
- 输入数组永远不会为空,但可能包含负数和/或重复项。
- 每个整数的绝对值将始终小于2 31。
测试用例
希望这些能够涵盖所有边缘情况:
[1] -> [1]
[1, 1] -> [1, 1]
[1, 2] -> [1, 2]
[2, 1] -> [1, 2]
[2, 3, 1] -> [2, 1, 3]
[2, 1, 3] -> [1, 2, 3]
[2, 1, 2] -> [1, 2, 2]
[2, 1, 1] -> [1, 1, 2]
[3, 1, 1, 2] -> [1, 1, 3, 2]
[3, 2, 1, 2] -> [1, 2, 3, 2]
[3, 1, 2, 2] -> [1, 3, 2, 2]
[1, 3, 2, 2] -> [1, 2, 2, 3]
[1, 0, 5, -234] -> [0, 1, -234, 5]
[1, 0, 1, 0, 1] -> [0, 1, 0, 1, 1]
[1, 2, 3, 4, 5] -> [1, 2, 3, 4, 5]
[5, 4, 3, 2, 1] -> [1, 2, 3, 4, 5]
[2, 1, 5, 4, 3] -> [1, 2, 3, 4, 5]
[2, 3, 1, 5, 4] -> [2, 1, 3, 4, 5]
[5, 1, 4, 2, 3] -> [1, 5, 2, 4, 3]
[5, 2, 7, 6, 4, 1, 3] -> [2, 5, 1, 4, 6, 7, 3]
[-5, -2, -7, -6, -4, -1, -3] -> [-5, -7, -2, -6, -4, -3, -1]
[14, 5, 3, 8, 15, 7, 4, 19, 12, 0, 2, 18, 6, 11, 13, 1, 17, 16, 10, 9] -> [3, 5, 14, 8, 4, 7, 15, 0, 12, 19, 2, 6, 18, 11, 1, 13, 9, 10, 16, 17]
计分
这是code-golf,因此以字节为单位的最短代码获胜。
O(n^2)
O(n)
。当您到达中间位置时,交换第一个和最后一个元素,然后交换第二个和第二个最后一个元素,依此类推。
O(n)
,但是反转可以直接建立在算法中(这就是我的JS回答所做的事情);由于每次迭代都会循环遍历数组中的每个项目一次,因此单次迭代为O(n)
。(我认为...)