zoukankan      html  css  js  c++  java
  • JS leetcode 搜索插入位置 题解分析

    壹 ❀ 引

    今天来做一道特别特别简单的题,来自leetcode35. 搜索插入位置,题目描述如下:

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

    你可以假设数组中无重复元素。

    示例 1:

    输入: [1,3,5,6], 5
    输出: 2
    

    示例 2:

    输入: [1,3,5,6], 2
    输出: 1
    

    示例 3:

    输入: [1,3,5,6], 7
    输出: 4
    

    示例 4:

    输入: [1,3,5,6], 0
    输出: 0
    

    我们来直接分析题目,给出解题思路:

    贰 ❀ 解题思路

    根据题目描述,我们已知数组为从小到大排列且无重复元素的有序序列,给定一个目标值,我们要找到第一个等于或大于它的元素的索引。

    为什么是大于或等于呢,等于不用解释,比如第二个例子[1,3,5,6]给定2,最终返回1,其实本质等于找到了第一个大于2的元素3,让3往后靠靠,再把2插入进去,而2正是取代了原先3的位置。

    当然,如果我们遍历了一遍都没找到符合的位置,则插入到数组的末尾,所以这里返回的就是数组的长度。

    知道了思路,那实现起来就很简单了,比如:

    /**
     * @param {number[]} nums
     * @param {number} target
     * @return {number}
     */
    var searchInsert = function (nums, target) {
        for (var i = 0; i < nums.length; i++) {
            // 大于等于目标值则返回索引
            if (nums[i] >= target) {
                return i
            };
        };
        // 反之返回length
        return nums.length;
    };
    

    当然,我最初想到的是find方法,由于长时间未用find有点陌生,导致我写了奇怪的代码:

    // 这是错误的示例
    var searchInsert = function (nums, target) {
        var result = nums.find((item, index) => {
            if (item >= target) {
                return index;
            };
        });
        return result ? result : nums.length;
    };
    

    这里我其实希望如果符合条件,就返回index给result,如果没找到result为undefined,所以利用这点来决定返回length或者是正确的index。

    但事实上find方法的特性是如下:

    • 当数组中的元素在测试条件时返回 true 时, find() 返回符合条件的元素,之后的值不会再调用执行函数。
    • 如果没有符合条件的元素返回 undefined。

    注意,是为 true 时 返回符合条件的元素,所以这里即使我们写了return index,也不会返回index,而是以index转为布尔值,来决定是否要返回当前item。所以上述的代码无法按照我们的预期找到想要的索引。

    当然,按照上面的思路,我们应该使用findIndex而非find,findIndex与find相同,同样是根据返回的布尔值决定是否要返回当前索引,如果遍历完成未找到,则返回-1,正确的代码是这样:

    /**
     * @param {number[]} nums
     * @param {number} target
     * @return {number}
     */
    var searchInsert = function (nums, target) {
        var result = nums.findIndex((item) => {
            return item >= target;
        });
        return result === -1 ? nums.length : result;
    };
    

    那么关于本题的分析就到这里了。

  • 相关阅读:
    双心ping GUI工具1.0
    判断手机连接的是fdd还是tdd的办法
    能在CAD2004以下版本里面打开2007以上版本文件的外挂
    关闭阿里旺旺后台服务
    map 后 PE 蓝屏原因专题讨论(e820cycles参数)
    关于e820cycles参数
    在XP下把win7安装到VHD,内存足够大可以RAMOS
    抛弃优启Grub4dos和PE大多数时间可以这样用
    考拉输入法1.1-古董级小巧连打输入法
    小韦XP 和win2003装电信天翼3G无线上网卡
  • 原文地址:https://www.cnblogs.com/echolun/p/13021149.html
Copyright © 2011-2022 走看看