给定排序数组,例如。 [1,2,3,4,5]
和此数组的变体,其中一个项目被移动到不同的位置(因此不再排序),例如。 [1,2,5,3,4]
或[2,3,4,1,5]
我需要可靠地确定"方向"移动 - 向左或向右取决于一个元素移动的方式
(5
在第一个示例中被移动left
,1
在第二个示例中被移动right
目前我有一个解决方案(从左侧)走过数组并比较它们在索引i
的值 - 一旦它们不相同(以确定差异点),它就会比较i+1
处的值。如果old[i+1] > new[i+1] then left, otherwise right
//pseudocode:
function(old, now) {
for(var i in old) {
if (old[i] !== now[i]) {
return old[i+1] > now[i+1] ? "left" : "right"
}
}
}
修改
是否有更可靠(可能更有效)的解决方案?目前它给出了误报"在某些情况下。我们事件需要第一个数组吗?它总是排序和顺序。
答案 0 :(得分:1)
您的解决方案确实没有任何改进空间 - 您无法找到解决问题的方法,而无需通过数组的所有成员并针对其他阵列中的成员进行检查。
您当前的时间复杂度是 O(n),实际上并不算太差。因此,您不必担心此功能,如果您的应用程序工作太慢,您应该寻找其他领域来改进。
答案 1 :(得分:0)
不是真正的答案,更多关于算法的讨论。
如果您希望保证从0开始的迭代并忽略继承的可枚举属性,请将 for..in 替换为 for , while 或< em>做循环。
给定索引0的迭代,你所拥有的算法不起作用。例如在下面:
var old = [1,2,3];
var now = [2,1,3];
值1已向右移动。该算法将在索引0处找到未匹配,然后比较索引1处的值。old[1]
大于now[1]
,因此返回“left”。
也无法确定某些动作的方向,例如:在上面是1向右移动还是2向左移动?另一个例子:
var old = [1,2,3,4,5];
var new = [1,2,3,5,4];
4向右移动还是5向左移动?需要一个规则来确定哪个需要预先确定。