我最近在工作时遇到一个问题,我有两个列表:一个主列表和一个较小的列表,其中包含主列表中项目的子集,可能以不同的顺序排列。我需要对主列表进行重新排序,以使子集中的项目以相同的顺序出现,而不更改列表中未找到的项目的顺序,并尽可能将项目保持在同一位置。好吧,这听起来可能令人困惑,所以我将其分解:
- 主清单定义了项目的默认顺序。
- 子集列表定义某些项目的相对顺序。
- 如果主列表中有两个元素按照子集列表的顺序排列不正确,则应将主列表中较早的项目移到最早的索引,该索引相对于子集列表中的其他项目位于正确的位置。(即紧接在后面的项目之后)
您的任务是实现此重新排序算法。
示例测试用例
Master: [1, 2, 3]
Subset: []
Result: [1, 2, 3]
Master: [9001, 42, 69, 1337, 420]
Subset: [69]
Result: [9001, 42, 69, 1337, 420]
Master: [9001, 42, 69, 1337, 420, 99, 255]
Subset: [69, 9001, 1337]
Result: [42, 69, 9001, 1337, 420, 99, 255]
Master: [1, 2, 3, 4, 5]
Subset: [2, 5]
Result: [1, 2, 3, 4, 5]
Master: [apple, banana, carrot, duck, elephant]
Subset: [duck, apple]
Result: [banana, carrot, duck, apple, elephant]
Master: [Alice, Betty, Carol, Debbie, Elaine, Felicia, Georgia, Helen, Ilene, Julia]
Subset: [Betty, Felicia, Carol, Julia]
Result: [Alice, Betty, Debbie, Elaine, Felicia, Carol, Georgia, Helen, Ilene, Julia]
Master: [snake, lizard, frog, werewolf, vulture, dog, human]
Subset: [snake, werewolf, lizard, human, dog]
Result: [snake, frog, werewolf, lizard, vulture, human, dog]
Master: [Pete, Rob, Jeff, Stan, Chris, Doug, Reggie, Paul, Alex]
Subset: [Jeff, Stan, Pete, Paul]
Result: [Rob, Jeff, Stan, Pete, Chris, Doug, Reggie, Paul, Alex]
Master: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
Subset: [8, 1, 2, 12, 11, 10]
Result: [3, 4, 5, 6, 7, 8, 1, 2, 9, 12, 11, 10]
Master: [lol, rofl, lmao, roflmao, lqtm, smh, jk, wat]
Subset: [wat, lmao, rofl]
Result: [lol, roflmao, lqtm, smh, jk, wat, lmao, rofl]
规则
- 标准漏洞,yadda yadda,方便的I / O,等等。
- 即使示例使用数字和字符串,您也只需要支持一种元素类型,无论是整数,字符串还是其他具有明确定义的等式语义的元素,如果使用您的语言方便,还可以包括异构列表。
- 您可以假定主列表和子集列表均不包含重复项
- 您可以假定在子列表中找到的所有项目都在主列表中找到
- 任一列表都可能为空
- 您至少必须支持最多100个元素的数组。
- 重新排序可以就地实现,也可以通过创建新列表/数组来实现。
高尔夫快乐!
8 1 3 4 5 6 7 2 9 12 11 10
倒数第二个有效的解决方案吗?