核心考点:数组操作,排序思想的扩展使用

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。例如将数组{1, 2, 3, 4, 5, 6}调整为{1, 3, 5, 2, 4, 6}。

解析一:(若相对位置可变)
若是题目当中没有要求数组调整后奇数和奇数,偶数和偶数的相对位置不变,那么我们可以使用两个变量(left和right)来遍历数组,left从左往右寻找偶数,right从右往左寻找奇数,之后将left和right索引的元素进行交换。

如此进行下去,直到left和right错开为止。

class Solution {public:void reOrderArray(vector<int> &array) {size_t left = 0, right = array.size() - 1;while (left < right){while (left < right&&array[left] % 2 == 1) //left向右找偶数{left++;}while (left < right&&array[right] % 2 == 0) //right向左找奇数{right--;}swap(array[left], array[right]); //交换left和right索引的元素}}
};

时间复杂度: O ( N ) O(N) O(N) 空间复杂度: O ( 1 ) O(1) O(1)

解析二:(空间换时间)
既然题目要求数组调整后奇数和奇数,偶数和偶数的相对位置不变,那么我们可以使用一个辅助容器,先遍历一遍原数组,将数组当中的奇数依次尾插到容器当中。

然后再遍历一遍原数组,将数组当中的偶数也依次尾插到容器当中。

最后再将辅助容器当中的数据拷贝回原数组即可。

class Solution {public:void reOrderArray(vector<int> &array) {vector<int> temp; //辅助容器//遍历数组将奇数尾插到temp容器当中for (auto e : array){if (e & 1) //是奇数temp.push_back(e);}//遍历数组将偶数尾插到temp容器当中for (auto e : array){if (!(e & 1)) //是偶数temp.push_back(e);}array = temp; //将temp容器赋值给array容器}
};

时间复杂度: O ( N ) O(N) O(N) 空间复杂度: O ( N ) O(N) O(N)

解析三:(时间换空间)
我们也可以选择将数组原地进行调整,调整过程大致如下:
首先定义三个变量:

  1. 变量 i:用于标记已经放好的奇数序列的后一个位置。
  2. 变量 j:用于遍历数组,寻找奇数。
  3. 变量 temp:用于暂时存储变量 j 找到的奇数。

变量 j 从左向右依次遍历数组,寻找奇数,找到奇数后将其暂时存储在temp变量当中,然后将变量 i 和变量 j 之间的数统一向后移动一位,最后再将temp变量当中存储的奇数放到 i 的位置,之后记得更新 i 的位置(因为已经放好的奇数序列此时增加了一个)。按此方法遍历数组,直到数组被遍历完毕为止。

动图演示如下:

class Solution {public:void reOrderArray(vector<int> &array) {int i = 0; //标记已经放好的奇数序列的后一个位置for (int j = 0; j < array.size(); j++){if (array[j] & 1) //找到奇数{int temp = array[j]; //先将这个奇数存储到temp变量当中//将变量i和变量j之间的数统一向后移动一位for (int k = j - 1; k >= i; k--){array[k + 1] = array[k];}array[i] = temp; //将temp变量当中存储的奇数放到i的位置i++; //更新i的位置}}}
};

时间复杂度: O ( N 2 ) O(N^2) O(N2) 空间复杂度: O ( 1 ) O(1) O(1)

【算法入门03】调整数组顺序使奇数位于偶数前面相关推荐

  1. java 取数组的前90位,LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面

    LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面 题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入 ...

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

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

  3. 面试 6:调整数组顺序使奇数位于偶数前面

    今天给大家带来的是 <剑指 Offer>习题:调整数组顺序使奇数位于偶数前面,纯 Java 实现希望大家多加思考. 面试题:输入一个整型数组,实现一个函数来调整该数组中的数字的顺序,使得所 ...

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

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

  5. 【剑指offer - C++/Java】13、调整数组顺序使奇数位于偶数前面

    在线题目链接:调整数组顺序使奇数位于偶数前面 文章目录 1 题目描述 2 题目分析 2.1 方法1 2.11 Java代码 2.12 C++代码 2.2 方法2 2.21 Java代码 2.22 C+ ...

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

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

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

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

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

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

  9. 【剑指offer-Java版】14调整数组顺序使奇数位于偶数前面

    调整数组顺序使奇数位于偶数前面:遍历交换 特殊输入: 1) 只有一个数字 2) 全奇数或者全偶数 3) 空指针 4) 正常输入 考虑到扩展性,C++里面使用了函数指针来实现,但是对于java,可以采用 ...

  10. 【编程题目】调整数组顺序使奇数位于偶数前面

    54.调整数组顺序使奇数位于偶数前面(数组). 题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分, 所有偶数位于数组的后半部分.要求时间复杂度为 O(n). 小题,秒灭. ...

最新文章

  1. ACM入门之【并查集】
  2. ExtJs+php学习长连接comet技术开端。
  3. 同步方法 调用异步防范_.NET Web应用中为什么要使用async/await异步编程?
  4. 【使用注意】文件内容突然消失
  5. 7-72 功夫传人 (25 分)(深搜)
  6. Mysql-不常用sql语句笔记与不常见错误
  7. AI 产品经理如何练就?一文了解十大必备技能
  8. 从零基础入门Tensorflow2.0 ----三、8. 自定义层次
  9. vue routes路由
  10. 晨曦记账本记账,导出账目保存表格
  11. Md5加密工具类DigestUtils
  12. 截取字符串中某一段数据
  13. flutter数据解析出现type ‘String‘ is not a subtype of type ‘int‘错误
  14. 新个税计算html、以及java源代码
  15. VIP邮箱哪个最好用?怎么申请163电子邮箱?
  16. LeetCode——347. 前 K 个高频元素【最小堆实现】
  17. IT30:30岁IT男未来10年规划第3篇(2009-2020)
  18. linux 内核 mtd读取,MTD坏块管理(二)-内核获取Nandflash的参数过程
  19. 【内推】阿里集团2015年实习生招聘
  20. 1225 D. Power Products 哈希

热门文章

  1. This code is using an older version of pydicom警告解决
  2. .NETMVC 使用过滤器完成未登录拦截
  3. 温州计算机职高学校排名,温州职高排名及分数线 2020最新排名
  4. P20、21、22 事件详解
  5. CoInitialize()与COM
  6. 免费unix shell账户申请网站
  7. Linux环境部署国产数据库达梦
  8. SFML(C++)实现贪吃蛇(带小地图、视角等)
  9. ASP.Net Core创建MVC项目上传文件(缓冲方式)
  10. Feign-feign.RetryableException: 192.168.100.26:8100 failed to respond executing GET URL