目录
题目:分离奇偶数
题目:分离奇偶数
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
示例:
解法一:菜鸟级
遍历数组,如果为奇数,则从数组开头往进放,如果为偶数,则放入另一个数组中。
后续将偶数的数组再从原数组上次的结尾往后放
class Solution {
public int[] exchange(int[] nums) {
int left=0;
int right=nums.length-1;
int[] arr=new int[nums.length];
int j=0;
int k=0;
for(int i=0;i<nums.length;i++) {
if(nums[i]%2!=0) {
nums[j]=nums[i];
j++;
} else {
arr[k]=nums[i];
k++;
}
}
for(int i=0;i<k;i++) {
nums[j]=arr[i];
j++;
}
return nums;
}
}
测试通过:
解法二:头尾指针
给左边和右边各标记上,左边判断是不是奇数,如果是奇数,则左边标记向前移一步,如果不是奇数,则停下来。再判断右边是否是偶数,同左边类似,停下后,左右交换数据,再进行新一轮的判断。
class Solution {
public int[] exchange(int[] nums) {
int left=0;
int right=nums.length-1;
while(left<right) {
while(nums[left]%2!=0&&left<right) {//遇到偶数停下来
left++;
}
while(nums[right]%2==0&&right>left) {
right--;
}
int tmp=nums[left];
nums[left]=nums[right];
nums[right]=tmp;
}
return nums;
}
}
提问:为什么里面又一次的判断保证left<right?
原因:
进入第一个循环时,是满足left<right,然后再进入循环,如果里面全是奇数,它是无法跳出第二个while的,一直加加,就会导致数组越界,所以我们要再次保证left<right
测试通过:
解法三:快慢指针
两个指针都从头开始,判断当前数据是否为奇数,如果为奇数,则快慢指针同时向前走一步,否则,快指针走,慢指针不动
class Solution {
public int[] exchange(int[] nums) {
int fast=0;//快指针
int slow=0;//慢指针
while(fast<nums.length) {
if(nums[fast]%2==1) {//奇数
int tmp=nums[fast];
nums[fast]=nums[slow];
nums[slow]=tmp;
slow++;
}
fast++;
}
return nums;
}
}
提问:为什么是奇数时,要交换?
原因:
看图理解:
测试通过:
再次优化解法三:
将模运算改成与运算
class Solution {
public int[] exchange(int[] nums) {
int fast=0;//快指针
int slow=0;//慢指针
while(fast<nums.length) {
if((nums[fast]&1)==1) {//奇数
int tmp=nums[fast];
nums[fast]=nums[slow];
nums[slow]=tmp;
slow++;
}
fast++;
}
return nums;
}
}
注意:与运算那里的括号
测试通过:
举一反三:解题:移动零
题目:给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
要求及示例:
解法一:快慢指针
class Solution {
public void moveZeroes(int[] nums) {
if(nums==null) {
return;
}
int fast=0;
int slow=0;
while(fast<nums.length) {
if(nums[fast]!=0) {
int tmp=nums[fast];
nums[fast]=nums[slow];
nums[slow]=tmp;
slow++;
}
fast++;
}
}
}
提交通过:
解法二:
将不是0的数据往前挪动,并记录0的个数
结束后,将后面置0
class Solution {
public void moveZeroes(int[] nums) {
if(nums==null) {
return;
}
int j=0;
int count=0;
for(int i=0;i<nums.length;i++) {
if(nums[i]!=0) {
nums[j++]=nums[i];
} else {
count++;
}
}
for(int i=j;i<nums.length;i++) {
nums[i]=0;
}
}
}
测试通过:
本期结束啦!!!
下期见!!!