剑指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++; //记录已经拍好顺序放左边的奇数
}
}
}
}