剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 && 57. 和为s的两个数字
21题目描述:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
解析:
1.双指针法,定义一个数组res,然后定义左右指针left和right
2.遍历循环数组nums,当数组中的值为偶数时,数组res从指针right开始添加,然后right--
当数组中的值为奇数时,数组res从指针left开始添加,然后left++
3.最后返回数组res即可
Java:
public int[] exchange(int[] nums) {
int[] res = new int[nums.length];
int left = 0, right = nums.length - 1;
for(int i = 0; i < nums.length; i++) {
if(nums[i] % 2 == 0) {
res[right--] = nums[i];
} else {
res[left++] = nums[i];
}
}
return res;
}
JavaScript:
var exchange = function(nums) {
let res = [];
let left = 0, right = nums.length - 1;
for(let i = 0; i < nums.length; i++) {
if(nums[i] % 2 === 0) {
res[right--] = nums[i];
} else {
res[left++] = nums[i];
}
}
return res;
};
57题目描述:
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
解析:
1.双指针法,定义左右指针left和right,for循环遍历数组
2.如果nums数组左右指针所在的值加和小于target,则left++
如果nums数组左右指针所在的值加和大于target,则right--
如果nums数组左右指针所在的值加和等于target,则输出nums数组中左右指针所在的值
3.如果遍历完还没找到,则返回空数组
Java:
public int[] twoSum(int[] nums, int target) {
int left = 0, right = nums.length - 1;
for(int i = 0; i < nums.length; i++) {
if(nums[left] + nums[right] < target) {
left++;
} else if(nums[left] + nums[right] > target) {
right--;
} else {
return new int[] {nums[left], nums[right]};
}
}
return new int[0];
}
JavaScript:
var twoSum = function(nums, target) {
let set = new Set();
for(let i = 0; i < nums.length; i++) {
if(!set.has(target - nums[i])) {
set.add(nums[i]);
} else {
return [nums[i], target - nums[i]];
}
}
return [];
};