交叉序列
给定一个正整数列表,如果每个元素大于或等于前一个A
,则称其为递增序列;否则,将其称为递增序列。如果每个元素小于或等于前一个元素,则将其称为递减序列。
一些增加的顺序:
[1,2,4,7]
[3,4,4,5]
[2,2,2]
[]
一些递减顺序:
[7,4,2,1]
[5,4,4,3]
[2,2,2]
[]
甲交叉序列是可以分解成两个不相交的子序列,一个增加的序列和其他的递减序列的列表。
例如,列表:
[3,5,2,4,1]
是交叉序列,因为它可以分解为:
[3, 4 ]
[ 5,2, 1]
哪里[3,4]
是增加的子序列,[5,2,1]
是减少的子序列。我们将这样的一对(递增,递减)子序列称为交叉序列的分解。
名单:
[4,5,2,1,3]
不是交叉序列;没有办法将其分解为增加和减少的子序列。
您的任务是编写一个程序/函数,将正整数列表作为输入;如果是交叉序列,则以其分解之一返回两个列表;或一些一致的“假”值(如果列表不是交叉序列)。
这是代码高尔夫球;每种语言中最短的程序/功能就是赢家。
规则:
- 输入是灵活的。
- 通常的漏洞是被禁止的。
- 如果有多种分解输入的有效方法,则可以输出其中一种或全部。
- 分解的输出格式很灵活;但是在两个子序列之间的区别上必须是明确的。
- 您可以使用任何一致的输出值来表示输入不是交叉序列。只要与任何交叉序列的输出相比,它都是明确的。您应该在答案中指定falsey值。
测试用例:
使用False
,以指示不交叉的序列:
[3, 5, 2, 4, 1] => [3, 4], [5, 2, 1]
[3, 5, 2, 4, 4, 1, 1] => [3, 4, 4], [5, 2, 1, 1]
[7, 9, 8, 8, 6, 11] => [7, 8, 8, 11], [9, 6]
[7, 9, 8, 8, 6, 11] => [7, 9, 11], [8, 8, 6] # also valid
[7, 9, 8, 8, 6, 11] => [7, 8, 11], [9, 8, 6] # also valid
[7, 8, 9, 10, 20, 30] => [7, 8, 9, 20, 30], [10]
[7, 8, 9, 10, 20, 30] => [8, 9, 10, 20, 30], [7] # this is also valid
[5, 5, 5] => [5, 5, 5], []
[4, 5, 2, 1, 3] => False
[3, 4, 3, 4, 5, 2, 4] => False
2
可能重复。我看到的只有两个区别是,另一个挑战应该在输入长度的多项式时间内运行,并允许使用真实值而不是两个子序列(返回子序列本身将获得20%的奖励)。听起来对我来说还是个骗子,但我不会锤子。
—
凯文·克鲁伊森
@KevinCruijssen的时间限制本身就足以使它不被欺骗。
—
肯尼迪
@NickKennedy可能是的,这就是为什么我不愿意锤打它。:)
—
凯文·克鲁伊森
建议的测试用例:
—
Grimmy
[3, 5, 2, 4, 4, 1, 1]
。当前的测试用例使您可以放心使用>=
/ <
,而实际上应该是>=
/ <=
。
@Arnauld:是的,它可以是任何值(“ false”只是说:输入是交叉序列是错误的)。
—
查斯·布朗