Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中找到元素的索引(如果存在)?_Javascript_Data Structures - Fatal编程技术网

如何在javascript中找到元素的索引(如果存在)?

如何在javascript中找到元素的索引(如果存在)?,javascript,data-structures,Javascript,Data Structures,你能告诉我怎么找到索引吗。我有个问题 Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order. You may assume no duplicates in the array. Example 1: Input: [1,3,5,6], 5

你能告诉我怎么找到索引吗。我有个问题

Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.

You may assume no duplicates in the array.

Example 1:

Input: [1,3,5,6], 5
Output: 2
Example 2:

Input: [1,3,5,6], 2
Output: 1
Example 3:

Input: [1,3,5,6], 7
Output: 4
我试过这样做

var searchInsert = function(nums, target) {
          if (target > nums[nums.length - 1]) return nums.length;
    if (target < nums[0]) return 0;
    let start = 0,
        end = nums.length - 1,
        mid = Math.floor((start + end) / 2);
    while (start < end) {
        if(nums[mid] == target) return  mid
        if(nums[mid] > target) end = mid -1;
        if(nums[mid] < target) start = mid +1;
        mid = Math.floor((start + end) / 2);
    }
    return nums.length %2 == 0 ? mid +1 : mid
};
我的测试用例只有在找不到要插入到完美索引中的元素时才会失败

最新答案

var searchInsert = function (nums, target) {
    if (target > nums[nums.length - 1]) return nums.length;
    if (target === nums[nums.length - 1]) return nums.length-1;
    if (target < nums[0]) return 0;

    if (target ===nums[0]) return 0;
    let start = 0,
        end = nums.length - 1,
        mid = Math.floor((start + end) / 2);
    while (start <= end) {
        if(nums[mid] == target) return  mid
        if(nums[mid] > target) end = mid -1;
        if(nums[mid] < target) start = mid +1;
        mid = Math.floor((start + end) / 2);
    }
    return  nums[mid] > target ? mid : mid + 1;
};

感谢您的帮助,此代码可以完美运行所有测试用例

您可以尝试使用.indexOfn和.sort,如下所示:

let arr = [1,3,5,6]
const needle = 0

function searchInsert (arr, needle) {
  let index = arr.indexOf(needle)

  if (index === -1) {
    arr.push(needle)
    arr = arr.sort((x, y) => x - y)
    index = arr.indexOf(needle)
  }

  return index
}

问题在于你最后的陈述

return nums.length %2 == 0 ? mid +1 : mid
在最后一种情况下,你的mid=1,因为数组的长度是2,所以你要加mid+1

一种方法是返回while本身的值,以防在数组中找不到目标,条件是start==end

const searchInsert=functionnums,目标{ 如果target>nums[nums.length-1]返回nums.length; 如果目标端=中间-1; 如果nums[mid]=结束{ 返回nums[mid]>目标?mid:mid+1 } mid=Math.floorstart+end/2; } }; console.logsearchInsert[1,3,5,6],5//2 console.logsearchInsert[1,3,5,6],2//1 console.logsearchInsert[1,3,5,6],7//4 console.logsearchInsert[1,3],2//1 console.logsearchInsert[1,2,3,5],4//3 console.logsearchInsert[1,2,3,4,5,7,9,10,15],8//6 console.logsearchInsert[0,1,3,4],2//2 console.logsearchInsert[1],1//0 console.logsearchInsert[0],1//1
console.logsearchInsert[],1//0您是否尝试了索引?您可能需要在问题中添加一个问题,即您正在寻找二进制搜索算法。否则,线性搜索答案将继续堆积…返回nums.length%2==0?mid+1:mid-我不知道num的长度在这里有什么影响。使用return nums[mid]>target?中期:中期+1;请参阅[1]1输出未定义预期0使用此选项,它会中断解决方案您正在尝试解决一个Ologn问题。这本身不会让我投反对票,但OP已经发布了一个几乎可以正常工作的二进制搜索,它只有一个很小的问题。因此,建议的代码是降级。而且,当你发布的答案根本没有回答问题时,你获得了否决票。您更新的答案不仅提供了比OP已有的性能差得多的性能,而且最终还修改了阵列。我明白了。我非常愿意听到关于性能的部分,因为我正在我的大多数项目中使用这种代码。线性搜索与二进制搜索。在VSO日志n上。谢谢@RobbyCornelissen!请参阅故障案例[1]1输出未定义预期0由于end=mid-1案例,可能发生反转,开始>结束。例如searchInsert[0,1,3,4],2.@ASDFGerte啊,这是一个很好的案例,试图查看所有案例,但没有想到这一点,请查看更新,如果它适用于所有案例,顺便说一句,感谢您指出
return nums.length %2 == 0 ? mid +1 : mid