算法:调整数组顺序使奇数位于偶数前面
问题
- 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
解决
//1、暴力解法,一种神奇的解法 》》
class Solution {
public int[] exchange(int[] nums) {
//奇数:不能够被2整除;偶数:能够被2整除,0也是偶数
int len1=nums.length;
int[] a=new int[len1];
int[] b=new int[len1];
int a1=0,b1=0;
for(int i=0;i<len1;i++){
if(nums[i]%2!=0) a[a1++]=nums[i];
if(nums[i]%2==0) b[b1++]=nums[i];
}
int te=0;
for(int j=0;j<len1;j++){
if(a[j]==0){
a[j]=b[te++];
}
}
return a;
}
}
// 2、快慢指针,从一侧开始
class Solution {
public int[] exchange(int[] nums) {
int slow = 0,fast = 0;
while(fast<nums.length){
if((nums[fast]&1)==1) swap(nums,slow++,fast);
fast++;
}
return nums;
}
public void swap(int[] nums,int a,int b){
int temp = nums[a];
nums[a] = nums[b];
nums[b] =temp;
}
}
// 3、利用双指针两头遍历交换
class Solution{
public int[] exchange(int[] nums){
if(nums.length==0) return nums;
int left=0,right=nums.length-1,temp;
while(left<right){ //left从左至右寻找偶数,right从右至左寻找奇数
while(left<right&&(nums[left]&1)==1) left++; //如果left遇到奇数就跳过
while(left<right&&(nums[right]&1)==0) right--; //如果left遇到偶数就跳过
// swap(nums,left,right); //当left位置上是偶数、rigth位置上是奇数时,交换两数位置,达到奇数放前面,偶数放后面
temp=nums[left];
nums[left]=nums[right];
nums[right]=temp;
}
return nums;
}
// public static void swap(int[] arr,int i,int j){ //交换数组两数位置方法
// int temp=arr[i];
// arr[i]=arr[j];
// arr[j]=temp;
// }
}
总结
三种算法种最后一种时间复杂度较优,因为使用了双指针分别从两头遍历
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程