一、删除元素
1.1 原地移除所有值等于val的元素
LeetCode 27.移除元素
解法1:快慢指针
class Solution {
public int removeElement(int[] nums, int val) {
int fast=0;
int slow=0;
for(; fast<nums.length; fast++){
if(nums[fast]!=val){
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
}
解法2:双指针+覆盖
class Solution {
public int removeElement(int[] nums, int val) {
int left=0;
int right=nums.length-1;
while(left<=right){
if(nums[left]==val){
nums[left] = nums[right--];
}else{
left++;
}
}
return left;
}
}
1.2 删除有序数组中的重复项
class Solution {
public int removeDuplicates(int[] nums) {
int slow = 1;
for(int fast=0;fast<nums.length;fast++){
if(nums[slow-1]!=nums[fast]){
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
}
二、元素奇偶移动
LeetCode 905.按奇偶排序数组
双指针遍历判断。
class Solution {
public int[] sortArrayByParity(int[] nums) {
int left = 0;
int right = nums.length - 1;
while(left<right){
if(nums[left]%2>nums[right]%2){
int tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
}
if(nums[left]%2==0) left++;
if(nums[right]%2==1) right--;
}
return nums;
}
}
三、数组轮转
LeetCode 189.轮转数组
比如 1,2,3,4,5,6,7。向右轮转3个位置,结果为5,6,7,1,2,3,4
可以把数组分为不轮转的数组和要轮转的数组两部分 1,2,3,4 和 5,6,7。各自反转为4,3,2,1和7,6,5。最后整体反转得到结果。
class Solution {
public void rotate(int[] nums, int k) {
int l = nums.length;
k %= l;
reverse(nums,0,l-k-1);
reverse(nums,l-k,l-1);
reverse(nums,0,l-1);
}
private void reverse(int[] nums,int left,int right){
while(left<right){
int tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
left++;
right--;
}
}
}