【算法入门03】调整数组顺序使奇数位于偶数前面
核心考点:数组操作,排序思想的扩展使用
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。例如将数组{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)
解析三:(时间换空间)
我们也可以选择将数组原地进行调整,调整过程大致如下:
首先定义三个变量:
- 变量 i:用于标记已经放好的奇数序列的后一个位置。
- 变量 j:用于遍历数组,寻找奇数。
- 变量 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】调整数组顺序使奇数位于偶数前面相关推荐
- java 取数组的前90位,LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面
LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面 题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入 ...
- 《LeetCode力扣练习》剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Java
<LeetCode力扣练习>剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Java 一.资源 题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组 ...
- 面试 6:调整数组顺序使奇数位于偶数前面
今天给大家带来的是 <剑指 Offer>习题:调整数组顺序使奇数位于偶数前面,纯 Java 实现希望大家多加思考. 面试题:输入一个整型数组,实现一个函数来调整该数组中的数字的顺序,使得所 ...
- 剑指Offer #13 调整数组顺序使奇数位于偶数前面 | 图文详解
题目来源:牛客网-剑指Offer专题 题目地址:调整数组顺序使奇数位于偶数前面 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的 ...
- 【剑指offer - C++/Java】13、调整数组顺序使奇数位于偶数前面
在线题目链接:调整数组顺序使奇数位于偶数前面 文章目录 1 题目描述 2 题目分析 2.1 方法1 2.11 Java代码 2.12 C++代码 2.2 方法2 2.21 Java代码 2.22 C+ ...
- 【LeetCode】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
[LeetCode]剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 文章目录 [LeetCode]剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 一.双指针 一.双指针 解题思路: ...
- 剑指offer——面试题14:调整数组顺序使奇数位于偶数前面
剑指offer--面试题14:调整数组顺序使奇数位于偶数前面 Solution1: 顺序交换,比较好的算法!!! class Solution { public:void reOrderArray(v ...
- 剑指offer:面试题21. 调整数组顺序使奇数位于偶数前面
题目:调整数组顺序使奇数位于偶数前面 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入:nums = [1,2,3,4 ...
- 【剑指offer-Java版】14调整数组顺序使奇数位于偶数前面
调整数组顺序使奇数位于偶数前面:遍历交换 特殊输入: 1) 只有一个数字 2) 全奇数或者全偶数 3) 空指针 4) 正常输入 考虑到扩展性,C++里面使用了函数指针来实现,但是对于java,可以采用 ...
- 【编程题目】调整数组顺序使奇数位于偶数前面
54.调整数组顺序使奇数位于偶数前面(数组). 题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分, 所有偶数位于数组的后半部分.要求时间复杂度为 O(n). 小题,秒灭. ...
最新文章
- ACM入门之【并查集】
- ExtJs+php学习长连接comet技术开端。
- 同步方法 调用异步防范_.NET Web应用中为什么要使用async/await异步编程?
- 【使用注意】文件内容突然消失
- 7-72 功夫传人 (25 分)(深搜)
- Mysql-不常用sql语句笔记与不常见错误
- AI 产品经理如何练就?一文了解十大必备技能
- 从零基础入门Tensorflow2.0 ----三、8. 自定义层次
- vue routes路由
- 晨曦记账本记账,导出账目保存表格
- Md5加密工具类DigestUtils
- 截取字符串中某一段数据
- flutter数据解析出现type ‘String‘ is not a subtype of type ‘int‘错误
- 新个税计算html、以及java源代码
- VIP邮箱哪个最好用?怎么申请163电子邮箱?
- LeetCode——347. 前 K 个高频元素【最小堆实现】
- IT30:30岁IT男未来10年规划第3篇(2009-2020)
- linux 内核 mtd读取,MTD坏块管理(二)-内核获取Nandflash的参数过程
- 【内推】阿里集团2015年实习生招聘
- 1225 D. Power Products 哈希
热门文章
- This code is using an older version of pydicom警告解决
- .NETMVC 使用过滤器完成未登录拦截
- 温州计算机职高学校排名,温州职高排名及分数线 2020最新排名
- P20、21、22 事件详解
- CoInitialize()与COM
- 免费unix shell账户申请网站
- Linux环境部署国产数据库达梦
- SFML(C++)实现贪吃蛇(带小地图、视角等)
- ASP.Net Core创建MVC项目上传文件(缓冲方式)
- Feign-feign.RetryableException: 192.168.100.26:8100 failed to respond executing GET URL