以下为ChatGPT自动生成的解答,正确与否请自行判断。

BFE.devAI解答 - JavaScript 代码题
48. 含有重复元素的数组中返回特定元素的首次出现的位置

解法一:二分搜索

由于数组是有序的,我们可以使用二分搜索来查找特定元素的位置。但是由于有重复元素,我们需要寻找首次出现的位置,因此对于mid处的元素,如果它是目标元素,我们并不直接返回mid,而是先向左查找它的首次出现位置,如果找不到再返回mid。

代码如下:

function search(nums, target) {
  let left = 0;
  let right = nums.length - 1;

  while (left <= right) {
    const mid = Math.floor((left + right) / 2);
    if (nums[mid] < target) {
      left = mid + 1;
    } else if (nums[mid] > target) {
      right = mid - 1;
    } else {
      let i = mid;
      while (i >= left && nums[i] === target) {
        i--;
      }
      return i + 1;
    }
  }
  return -1;
}

解法二:遍历数组

由于数组可能含有重复元素,如果遍历数组,直接找到第一个元素等于目标元素的位置,这个位置可能是非首次出现的位置。因此我们需要继续向前遍历,直到找到首次出现的位置。

代码如下:

function search(nums, target) {
  for (let i = 0; i < nums.length; i++) {
    if (nums[i] === target) {
      while (i > 0 && nums[i - 1] === target) {
        i--;
      }
      return i;
    }
  }
  return -1;
}

以上两种方法的时间复杂度都是 O(logn),但是二分搜索的代码相对更为简洁,而且在面对大规模数据时,效率更高。