以下为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),但是二分搜索的代码相对更为简洁,而且在面对大规模数据时,效率更高。