剑指offer 13:调整数组位置使得奇数位于偶数前-- Java实现

剑指offer每日一题算法题(java解法)

方便日后复习,从今天开始。

算法之行始于足下

[编程题]调整数组位置使得奇数位于偶数前-- Java实现

------------------------------------------------------------------------------------------------------
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变

偷天换日-数组转存(拼接法)

解题思路:
1.循环遍历原数组,偶数放进一个集合里,奇数放进一个集合里。
2.最后遍历2个集合,把它们拼接起来,只用注意用一个变量存住拼接完第一个集合的末尾下标,方便拼接第二个集合的值。



import java.util.ArrayList;
import java.util.List;
public class Solution {
    public void reOrderArray(int [] array) {
        List<Integer> odd = new ArrayList<Integer>();
        List<Integer> even = new ArrayList<Integer>();
        int n = array.length;
        int temp=0;
        for(int i = 0;i < n;i++){
           temp = array[i];
           if(temp % 2 == 1){//偶数情况
               odd.add(temp);
                }
            else{               //奇数情况
               even.add(temp);
                }
            }
        temp=0;
        for(int j = 0;j < odd.size();j++){   //4
            array[temp] = odd.get(j);
            temp++;
        }
        for(int k = 0;k < even.size();k++){   //3
            array[temp] = even.get(k);
            temp++;
        }
    }
}

冒泡换位(排序法)

解题思路:
1.记录已经排的奇数个数,奇数循环末尾加一
2.记录当前奇数的数组下标,采用冒泡排序一个个把下标换到排好的奇数旁边,
奇数个数刚好为它相邻的空位,所以下标要大于奇数个数,每循环一次下标移一位。

public class Solution {
    public void reOrderArray(int [] array) {
        int count=0;
        for(int i=0;i<array.length;i++){   
            if(array[i]%2==1){   //如果为奇数
                int j=i;   //记录奇数的数组下标
                while(j>count){       //当右边奇数没靠到左边的时候
                    int tmp=array[j];
                    array[j]=array[j-1];
                    array[j-1]=tmp;
                    j--;
                }
                count++;     //记录已经拍好顺序放左边的奇数
            }
        }
    }
}

发布了52 篇原创文章 · 获赞 10 · 访问量 1542

猜你喜欢

转载自blog.csdn.net/jiohfgj/article/details/103047312