1. 程式人生 > 實用技巧 >劍指offer21.調整陣列順序使奇數位於偶數前面

劍指offer21.調整陣列順序使奇數位於偶數前面

方法一:一般方法:

程式碼如下:

 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 }