这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战
移动零
题目
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
题解
思路一:
遍历数组,将为0的数删除。最后将后面缺失的位置补0。
思路二:
使用左右指针指向为0的左右边界。当遍历遇到不为0的数值时,将该值与左边界的0交换,左右边界向后移;遇到的值为0时,直接扩展0的有边界,继续下一步骤。
代码
思路一:
var moveZeroes = function (nums) {
let len = nums.length - 1
for (let i = 0; i < nums.length; i++) {
if (nums[i] == 0) {
nums.splice(i, 1)
i--
}
}
while (nums.length <= len) {
nums.push(0)
}
return nums
};
思路二:
var moveZeroes = function (nums) {
let l = 0, r = 0, index = 0
while (index < nums.length) {
if (nums[index] == 0) {
r = index++
} else {
swap(nums, l++, index++)
r++
}
}
return nums
};
function swap(arr, i, j) {
let temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}
两数之和 II - 输入有序数组
题目
给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例 1:
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
题解
在输入的数组中,必然有唯一一对答案存在,所以我们可以忽略没有的情况。顺序数组中使用左右指针,分别指向头和尾。判断两者相加情况:相等直接返回;大于目标值,说明尾部数值过大,缩小范围,将右指针左移;小于目标值,说明左指针数值过小,左指针右移。直到左右指针相遇。
代码
var twoSum = function (numbers, target) {
let l = 0, r = numbers.length - 1, mid
while (l < r) {
if (numbers[l] + numbers[r] === target) return [l + 1, r + 1]
if (numbers[l] + numbers[r] > target) r--
else if (numbers[l] + numbers[r] < target) l++
}
return [-1, -1]
};
题目来源:leetcode