当前位置: 首页 > 知识库问答 >
问题:

如何使检查更坚固和更短?

方梓
2023-03-14

我写了这段代码,但我不知道为什么会这样,尤其是使用第三和第四个示例作为输入。为什么“中间”地位仍然如此落后-在数字5(或索引2)中使用[1,3,5,6]数组和数字7作为目标??

如何让它变得更好??当目标值不在数组中时,我想不出一种更短或更好的方法来检查if/elses,尤其是当输入是一个只有一个值的数组并且要查找的目标为0时。也许是检查可能的不同场景的更好方法。或者如何在没有那么多if/els的情况下更好地检查目标的正确位置。

例如,这段代码对于编码面试来说够好了吗?我能做得更好吗?

来自LeetCode:

搜索插入位置

给定一个不同整数的排序数组和一个目标值,如果找到目标,则返回索引。如果不是,则返回索引,如果它是按顺序插入的话。

您必须编写一个运行时复杂度为O(log n)的算法。

示例1:输入:nums=[1,3,5,6],目标=5输出:2

示例2:输入:nums=[1,3,5,6],目标=2输出:1

示例3:输入:nums=[1,3,5,6],目标=7输出:4

尤其是这个:示例4:输入:nums=[1],target=0

约束:1

这是我的代码:

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var searchInsert = function(nums, target) {
    let left = 0;
    let right = nums.length -1;
    let middle;
    while(left <= right){
        middle = nums.length>1 ? (Math.floor(left + (right - left)/2)) : 0;
        if(nums[middle] === target){
            return middle;
        } else if(target < nums[middle]){
            right = middle -1;
        } else {
            left = middle + 1;
        }
    }
    
    console.log(`Middle: ${middle}`);
    console.log(`Middle-1: ${nums[middle-1]}`);
    if(nums.lenght === 1){
        return 0;
    } else {
        if((target < nums[middle] && target > nums[middle-1] )|| (target < nums[middle] && nums[middle-1] === undefined)){ /*
No more items to the left ! */
        return middle; 
    } else if(target<nums[middle] && target<nums[middle-1]){
        return middle-1;
    } else if(target > nums[middle] && target > nums[middle + 1]) {
        return middle + 2; /* Why the 'middle' is so behind here? using the THIRD example as input?? */
    } else {
        return middle + 1;
    }
    }
};

共有1个答案

廖永长
2023-03-14

问题在于您在 while 循环后检查的变量。

在“经典”二叉搜索算法中,超出while循环将表明大海捞针中不存在。但是,如果出现此问题,我们只需要在代码的这个地方返回右 1(而不是检查中间)。

您的代码为此进行了调整:

var searchInsert = function(nums, target) {
    let left = 0;
    let right = nums.length -1;
    let middle;
    while(left <= right){
        middle = nums.length>1 ? (Math.floor(left + (right - left)/2)) : 0;
        if(nums[middle] === target){
            return middle;
        } else if(target < nums[middle]){
            right = middle -1;
        } else {
            left = middle + 1;
        }
    }
    
    return right + 1;
};

console.log(
  searchInsert([1,3,5,6], 5),
  searchInsert([1,3,5,6], 2),
  searchInsert([1,3,5,6], 7),
  searchInsert([1], 0)
);
 类似资料:
  • 问题内容: 我正在尝试检查文本字段何时更改,也等同于用于textView的功能- 到目前为止,我已经做到了: 哪种方法有效,但是只要在按下文本字段时就启用,我希望仅在实际键入文本时才启用它? 问题答案: 迅速 斯威夫特4.2 和 SWIFT 3和Swift 4.1 和 SWIFT 2.2 和 目标C 和textFieldDidChange方法是

  • 我正在使用Ubuntu Linux。 如何检查当前的版本?我猜,我有6个版本,但我不确定。 有没有办法改变它,因为我需要4个版本。有人能循序渐进地发出命令吗?

  • 若要让 Polar Verity Sense 保持在最新状态并获得最佳性能,请务必确保在有新版本固件可用时及时更新固件。执行固件更新是为了提高传感器的性能。 您不会因固件更新而丢失任何数据。开始更新前,Verity Sense 中的数据已同步至您的 Flow 账户。 利用手机或平板电脑 如果使用 Polar Flow 移动应用,您可利用手机来更新固件。该应用会通知您是否有更新可用,并指导您进行更新

  • 若要让手表保持在最新状态并获得最佳性能,请务必确保在有新版本固件可用时及时更新固件。执行固件更新以提高手表的性能。这包括全新功能、现有功能的提升,或错误修复。 您不会因为固件更新丢失任何数据。开始更新前,来自手表的数据已同步至 Flow 网络服务。 利用移动设备或平板电脑更新固件 如果您使用 Polar Flow 移动应用程式来同步您的训练和活动数据,您可以利用移动设备来更新固件。该应用程式会让您

  • 若要让手表保持在最新状态并获得最佳性能,请务必确保在有新版本固件可用时及时更新固件。执行固件更新以提高手表的性能。这包括全新功能、现有功能的提升,或错误修复。 您不会因为固件更新丢失任何数据。开始更新前,来自手表的数据已同步至 Flow 网络服务。 利用移动设备或平板电脑更新固件 如果您使用 Polar Flow 移动应用程式来同步您的训练和活动数据,您可以利用移动设备来更新固件。该应用程式会让您

  • 利用电脑 您可以自行更新 A370 的固件,使其保持最新状态。任何时候若有新的固件版本可用,当您将 A370 连接至电脑时,FlowSync 会通知您。通过 FlowSync 下载固件更新版本。 执行固件更新以提高 A370 的性能。这包括现有功能的提升、全新功能或错误修复。 要更新固件: 将 A370 插入具有 USB 连接线的电脑。 FlowSync 开始同步数据。 同步后,系统会要求您更新固

  • 您可以自行更新 A300 的固件,并使其保持最新状态。任何时候若有新的固件版本可用,当您将 A300 连接至您的电脑时,FlowSync 会通知您。固件更新内容可通过 FlowSync 下载。当新的固件可用时,Flow 应用程式也会通知您,但不能通过该程序进行更新。 执行固件更新以提高 A300 的性能。固件更新包括现有功能的提升、全新功能或错误修复等。 要更新 A300 的固件,您必须: 拥有一

  • 我正在尝试检查文本字段何时更改,也相当于用于text View-的函数,到目前为止我已经这样做了: 哪种方法有效,但是一旦按下文本字段,,我希望仅在实际键入文本时才启用它?