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