劍指offer21.調整陣列順序使奇數位於偶數前面
阿新 • • 發佈:2020-08-01
方法一:一般方法:
程式碼如下:
1 int* exchange(int* nums, int numsSize, int* returnSize){ 2 int *new=(int *)malloc(sizeof(int)*numsSize);//定義一個新陣列用來存放調整後的陣列 3 int index=0,k=numsSize-1; 4 for(int i=0;i<numsSize;i++) 5 { 6 if(nums[i]%2!=0) 7 { 8 new[index++]=nums[i]; //新陣列從頭開始存放奇數 9 } 10 else 11 { 12 new[k]=nums[i]; //新陣列從尾部開始存放偶數 13 k--; 14 } 15 } 16 *returnSize=numsSize; 17 return new; 18 19 }
方法二:雙指標
1、定義一個left,令left=0,指向第一個元素,定義一個right,令right=numsSize-1指向最後一個元素。
2、left向右移,直到指向偶數
3、right向左移,直到指向奇數
4、交換nums[left]和nums[right]的值
5、重複以上操作,直到left==right.
1 void swap(int* nums,int i,int j) //交換函式,交換奇數和偶數 2 { 3 int temp=nums[i]; 4 nums[i]=nums[j]; 5 nums[j]=temp; 6 } 7 int* exchange(int* nums, int numsSize, int* returnSize){ 8 int left=0,right=numsSize-1; 9 while(left<right)10 { 11 if(nums[left]%2!=0) 12 { 13 left++; 14 continue; 15 } 16 if(nums[right]%2==0) 17 { 18 right--; 19 continue; 20 } 21 if ((nums[left] % 2) == 0&& (nums[right] % 2) == 1) { 22 swap(nums,left,right); 23 left++; 24 right--; 25 26 } 27 } 28 *returnSize=numsSize; 29 return nums; 30 }
方法三:快慢指標
使用快慢指標
慢指標:定位偶數
快指標:定位奇數
兩指標的數值進行交換
例如:
1,2,3,4
1,2(slow),3(fast),4
1,3,2(slow),4(fast)
end;
作者:sugar-31
連結:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/solution/kuai-man-zhi-zhen-zai-yuan-shu-zu-shang-jin-xing-x/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
1 void swap(int* nums,int i,int j) 2 { 3 int temp=nums[i]; 4 nums[i]=nums[j]; 5 nums[j]=temp; 6 } 7 int* exchange(int* nums, int numsSize, int* returnSize){ 8 int slow=0; 9 //求第一個偶數 10 while(slow<numsSize&&nums[slow]%2!=0) 11 { 12 slow++; 13 } 14 int fast=slow+1; 15 while(fast<numsSize) 16 { 17 //找奇數 18 if(nums[fast]%2!=0) 19 { 20 swap(nums,slow,fast); //奇數和偶數交換 21 slow++; 22 } 23 fast++; 24 } 25 *returnSize=numsSize; 26 return nums; 27 }