【问题标题】:Find moved object in array在数组中查找移动的对象
【发布时间】:2022-11-12 08:43:12
【问题描述】:

例如,我已经对数组 [1、2、3、4、5、6] 进行了排序。在用户移动一些元素之后,例如这里是 6,我有一个数组 [1, 2, 3, 6, 4, 5]。如何找出哪个元素被移动了。我需要它的索引。

检查每对元素是否相等的简单枚举是我的低效解决方案。

【问题讨论】:

  • moving operation 是什么?值得明确定义。
  • 为什么您认为您的解决方案效率低下?
  • 当我们有 [1,3,2,4,5,6] 时,您认为哪个元素被移动了? 2 还是 3?请显示您的代码以及您遇到的效率问题。
  • 我很确定最坏情况下的复杂度不会低于 O(n)。考虑找到交换的两个元素
  • 对于由连续整数组成的整数数组的特殊情况,二进制搜索方法可能会起作用。对于更任意的排序列表,我认为@Marat 是正确的,你不会比线性列表做得更好。

标签: arrays algorithm


【解决方案1】:

@user3386109 在 cmets 中很好地描述了解决方案。我只想向您展示我的代码示例。

let oldOrderArray = [1,2,3,4,5,6];
let newOrderArray = [2,3,4,1,5,6];
let movedItem = 0;
let mismatchPoint = 0;
    for(let i = 0; i < newOrderArray.length; i++) {
        if(oldOrderArray[i] != newOrderArray[i]) {
            mismatchPoint = i;
            break;
        }
    }
    if(newOrderArray[mismatchPoint] > newOrderArray[mismatchPoint + 1]) {
        movedItem = newOrderArray[mismatchPoint];
    } else {
        for(let i = newRateOrder.length; i > mismatchPoint; i--) {
            if(oldOrderArray[i] != newOrderArray[i]) {
                movedItem= newOrderArray[i];
                break;
           }          
    }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    相关资源
    最近更新 更多