调整数组顺序使奇数位于偶数前面(点击链接进入题目)

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

题目分析:针对本题,我们有不同的方法来解决,本题中保证奇数和偶数之间的相对位置不变是一个难点,读者们可以分别考虑两种情况:a-相对位置变化;b-相对位置不变。

法一:我们很容易想到的一个方法就是对数组进行遍历,此时借助一个辅助数组newarray,遍历第一遍数组找出奇数,挨个尾插到newarray中,然后再遍历一遍,找出所有的偶数依次尾插,但是该方法不管是空间复杂度还是时间复杂度都是不推荐的。

class Solution {public:void reOrderArray(vector<int> &array) {vector<int> newarray;//遍历第一遍找出所有的奇数for(const auto& val : array){if(val % 2 != 0)newarray.push_back(val);}//遍历第二遍找出所有的偶数for(const auto& val : array){if(val % 2 == 0)newarray.push_back(val);}//赋值重载array = newarray;}
};

法二:我们还是malloc一块和array大小一样的空间newarray,然后定义start和end两个变量,start指向array数组的头,end指向array的尾,让start从头找奇数,找到并从newarray的头依次向后插入,end从尾找偶数,找到并从newarray的尾依次向前插入。
start找奇数的过程如下:(部分)

end找偶数的过程如下:(部分)

class Solution {public:void reOrderArray(vector<int> &array) {//开辟和array大小一样的数组newarrayvector<int> newarray(array.size());//定义start和end两个变量int start = 0;int end = array.size() - 1;//start从头部开始找奇数,并从newarray的头部依次向后插入int count = 0;while(start < array.size()){if(array[start] % 2 != 0)newarray[count++] = array[start];start++;}//end从尾部开始找偶数,并从newarray的尾部依次向前插入int sz = array.size();while(end >= 0){if(array[end] % 2 == 0)newarray[--sz] = array[end];end--;}array = newarray;}
};

法三:借助法二的方法,我们还是定义end和start,不过这时start和end同时去找奇数和偶数,start从头找奇数,找到便停下,end从尾找偶数,找到便停下,然后交换start和end两个位置的值,循环下去,但是这种方法得到的数组奇数和偶数的相对位置发生变化了。

class Solution {public:void reOrderArray(vector<int> &array) {int start = 0;int end = array.size() - 1;while(start < end){while(((start < end) && (array[start] & 1)))start++;while(((start < end) && !(array[end] & 1)))end--;swap(array[start], array[end]);}}
};

法四:要想保证相对位置不变,我们可以从前往后遍历数组,把偶数后移,腾出位置,放入奇数,即每找出一个奇数,把奇数前的位置全部后移一位,然后奇数插到最前面,奇数位置调整好之后,偶数位置自然就调整好了。

下图给了调整的两种情况的图:


class Solution {public:void reOrderArray(vector<int> &array) {int k = 0;//遍历整个数组for(int i = 0; i < array.size(); ++i){//找到奇数if(array[i] & 1){ //从左向右,每次遇到的,都是最前面的奇数,一定将来要被放在k下标处int temp = array[i]; //现将当前奇数保存起来int j = i;while(j > k){ //将该奇数之前的内容(偶数序列),整体后移一个位置array[j] = array[j-1];j--;}//将奇数保存在它将来改在的位置,因为我们是从左往右放的,没有跨越奇数,所以一定是相对位置不变的array[k++] = temp; }}}
};

调整数组顺序使奇数位于偶数前面相关推荐

  1. 剑指offer 调整数组顺序使奇数位于偶数前面

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

  2. 剑指offer-99.调整数组顺序使奇数位于偶数前面

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

  3. 剑指offer0JZ81 调整数组顺序使奇数位于偶数前面(二)(C++,附思路)

    描述 输入一个长度为 n 整数数组,数组里面可能含有相同的元素,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,对奇数和奇数,偶数和偶数之间的相对 ...

  4. 【LeetCode笔记】剑指 Offer 21-. 调整数组顺序使奇数位于偶数前面(Java、双指针)

    文章目录 题目描述 思路 & 代码 二刷 题目描述 有点像快排的交换操作 思路 & 代码 类似快排中的找法,具体见代码注释 class Solution {public int[] e ...

  5. 【双100%解法】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

    立志用最少的代码做最高效的表达 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入:nums = [1,2,3,4] 输 ...

  6. 《LeetCode力扣练习》剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Java

    <LeetCode力扣练习>剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Java 一.资源 题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组 ...

  7. 剑指Offer #13 调整数组顺序使奇数位于偶数前面 | 图文详解

    题目来源:牛客网-剑指Offer专题 题目地址:调整数组顺序使奇数位于偶数前面 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的 ...

  8. 【LeetCode】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

    [LeetCode]剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 文章目录 [LeetCode]剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 一.双指针 一.双指针 解题思路: ...

  9. 剑指offer——面试题14:调整数组顺序使奇数位于偶数前面

    剑指offer--面试题14:调整数组顺序使奇数位于偶数前面 Solution1: 顺序交换,比较好的算法!!! class Solution { public:void reOrderArray(v ...

  10. 剑指offer:面试题21. 调整数组顺序使奇数位于偶数前面

    题目:调整数组顺序使奇数位于偶数前面 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入:nums = [1,2,3,4 ...

最新文章

  1. python一个图画两条曲线_用python建立两个Y轴的XY曲线图方法
  2. VMware View 5.0 Ready! 资源汇总(持续更新)
  3. linux shell trap的使用
  4. 最好的FLV视频下载器 维棠 (支持优酷视频下载、土豆视频下载等)
  5. 如何绘制逻辑图 — 1. 逻辑图构成的三元素
  6. AVVision Organized Session (IROS'21) 征稿开启
  7. iphonexr电池容量_初代手机到iPhone 12,从电池容量变化看充电功率的发展
  8. php jquery mysql,使用PHP / MySQL搜索并使用jQuery动态更新
  9. SpringMVC 单文件上传与多文件上传
  10. 到 Google 面试去!开发者必读的避坑指南
  11. vue 打包之后不兼容ie_vue中使用的一些问题(IE不兼容,打包样式不生效)
  12. 关于解决vivado error:add_1 must be in range [-1,DEPTH-1] 问题
  13. activemq网页管理端使用_极周PC端(网页版)使用说明
  14. 28KHZ/40KHZ老款超声波开关线路板
  15. 微信小程序视频URL测试地址 MP4格式
  16. android 主流机型排行,安卓手机性能排行:华为Mate40 Pro仅排第四,第一名无可撼动...
  17. 国内外企业争食海淘:顺丰布局转运业务
  18. 行测:判断推理(逻辑判断)
  19. 如何查询网站服务器类型
  20. [CentOS Python系列] 五.阿里云部署web环境及通过IP地址访问服务器网页

热门文章

  1. 此生不戒多巴胺-冲刺日志(第二天)
  2. 8.4 输入某班学生某门课的成绩,(最多不超过40人,具体人数由用户键盘输入),用函数编程统计不及格人数
  3. 翻译mosHow to Switch to a New Undo Tablespace (文档 ID 1951695.1)使用新的undo表空间和删除旧的表空间
  4. 思科交换机创建Vlan时出错的解决方法(二)
  5. aistarter助手程序未运行_[MBOT+ AI2] 出現aiStarter程式不在執行狀態中的解決方法...
  6. awk中的输入分隔符
  7. 【buu平台】[GXYCTF2019]BabySQli
  8. Speedoffice(word)如何查询文档字数
  9. 发现有道云笔记用的搜索也是clucene引擎
  10. 人工智能和文本分析:遵循的最佳方法