刷前点说
以后的话,除了代码和想说的话,就会的剪短文章的长度,
因为在写文章上浪费了太多的是时间!
其实刷题是不难的,难的是坚持!
这个分栏是《剑指 offer》 的经典题目,
并在这个博客里记录自己的理解与学习过程!
题目介绍(LINK)
注意看题目:其实题目描述有一点不一样,返回值是不一样的,但是问题不大!
那关于题目的话,我就不做过多的介绍了,照抄的意义不大,我在这里直接贴链接了!
LeetCode链接:点击这里!
NowCoder链接:点击这里!
思路/想法
1. 初始思路/最终思路
最简单的做法就是:遍历之后把奇数和偶数分别放进去就可以。
或者是定义两个引用,奇数从前面放,偶数从后放。
还有一个方法就是:定义首尾指针,然后首指针遇见奇数后++,尾指针遇见偶数后–;
首指针遇见偶数,尾指针遇见奇数两指针交换。
这个方法相对位置变的情况的!
为了解决这个问题:就是用了插入排序的思想!
就是从前往后把偶数往后移动,腾出位置,放入奇数,
这样的有点是:偶数和奇数的位置相对位置是不变的!
2. 注意点
这道题是一道变种题:
就是有相对位置不变和变两种情况的!
不变的简单一点!
判断奇数和偶数:
非常的简单,十进制转化成二进制的时候最后一位的数字一定是0或1,和 1 &
的时候,等于1就是奇数;等于0就是偶数!
自己写的(相对位置变)
首指针遇见奇数后++,尾指针遇见偶数后–;
首指针遇见偶数,尾指针遇见奇数两指针交换!
package com.company;
import java.util.Arrays;
public class Main {
public static int[] reOrderArray(int[] array) {
int left = 0;
int right = array.length - 1;
while(left < right) {
while(left < right && ((array[left] & 1) == 1)) { //首指针遇见奇数后++
left++;
}
while(left < right && ((array[right] & 1) != 1)) { //尾指针遇见偶数后--
right--;
}
if(left < right) { //交换
int temp = array[left];
array[left] = array[right];
array[right] = temp;
}
}
return array;
}
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6};
System.out.println(Arrays.toString(array));
System.out.println(Arrays.toString(reOrderArray(array)));
}
}
NowCoder(相对位置不变)
public class Solution {
public void reOrderArray(int [] array) {
if(array == null || array.length == 0) {
return;
}
int k = 0;
for(int i = 0; i < array.length; i++) {
if((array[i] & 1) == 1) { //判断为奇数
int temp = array[i];//把奇数保存进tmp
int j = i;
while(j > k) {
array[j] = array[j - 1];//把偶数序列往后移动
j--;
}
array[k++] = temp;//把奇数插进去
}
}
}
}
LeetCode(相对位置该不该都行)
class Solution {
public int[] exchange(int[] nums) {
int k = 0;
for(int i = 0; i < nums.length; i++) {
if((nums[i] & 1) == 1) {
int temp = nums[i];
int j = i;
while(j > k) {
nums[j] = nums[j -1];
j--;
}
nums[k++] = temp;
}
}
return nums;
}
}
感谢语
这道题笔试的时候出现的机率不大,面试的时候出现的机率大!
所以是比较简单的,大家刷题的时候一定要有耐心慢慢钻研!