【发布时间】:2020-11-27 21:58:08
【问题描述】:
我在一个定时 leetcode 类型的问题生成器中遇到了一个问题,很沮丧,除了一些初始输入之外,我无法解决 100% 的测试用例。
该问题要求用户使用数组输入,以便对数组进行排序,使类似的值彼此“接触”。此外,内部数组可以反转,以便可以产生匹配。每个内部数组都可以排序的结果是可能的。
例如,可以对数组 'test = [[3,5],[4,2][5,2]]' 进行排序,以便 test[0] 位于 test[2] 旁边,然后可以匹配测试[1]。最终结果为 test = [[3,5],[5,2][2,4]]。
虽然一个简单的迭代解决方案检查匹配,反转数组并再次检查,移动到下一个数组,然后重复直到所有数组都已排序等,但适用于初始测试用例,但我用完了是时候找到一个更动态的解决方案来处理更复杂的测试用例了,包括当起始内部数组不是最优的时,以及它们是否有多个可能的初始匹配,但只有一个可以保证整个数组可以排序。
以下是原始代码提交后的测试用例失败的示例:
// base test case
test1 = [[3,5],[5,1],[2,7],[1,4],[4,2],[7,0]]
//starting node shift test case
test2 = [[5,1],[2,7],[1,4],[4,2],[7,0],[3,5]]
//multiple node possibilities test case
test3 = [[3,5],[5,1],[2,7],[1,4],[4,2],[9,5]]
function organizer(arr) {
let temp = arr.shift()
let result = [temp[0], temp[1]]
while (arr.length) {
for (let i = 0; i < arr.length; i++) {
let current = arr[i]
if (current[0] === result[result.length - 1]) {
result.push(current[1])
arr = arr.slice(0, i).concat(arr.slice(i + 1))
} else if (current[1] === result[result.length - 1]) {
result.push(current[0])
arr = arr.slice(0, i).concat(arr.slice(i + 1))
}
}
}
return result
}
最初我认为可能需要一些回溯解决方案来检查所有组合,或者使用排列来生成所有可能的数组,然后仅在对所有可能的内部数组进行排序时才返回答案......但我可以'不由认为我错过了一个更明显的解决方案。
我在这里错过了什么?
【问题讨论】:
-
必须有一些额外的约束,否则问题就是要找到一个哈密顿路径,这是NP-hard的。
标签: javascript arrays algorithm sorting