当前位置: 首页 > article >正文

剑指 Offer(第2版)面试题 21:调整数组顺序使奇数位于偶数前面

剑指 Offer(第2版)面试题 21:调整数组顺序使奇数位于偶数前面

  • 剑指 Offer(第2版)面试题 21:调整数组顺序使奇数位于偶数前面
    • 解法1:遍历
    • 解法2:双指针
      • What's more?

剑指 Offer(第2版)面试题 21:调整数组顺序使奇数位于偶数前面

题目来源:32. 调整数组顺序使奇数位于偶数前面

解法1:遍历

最垃圾的写法。

代码:

class Solution
{
public:
	void reOrderArray(vector<int> &array)
	{
		vector<int> odd, even;
		for (int &x : array)
		{
			if (x % 2)
				odd.push_back(x);
			else
				even.push_back(x);
		}
		int idx = 0;
		for (int &x : odd)
			array[idx++] = x;
		for (int &x : even)
			array[idx++] = x;
	}
};

复杂度分析:

时间复杂度:O(n),其中 n 是数组 array 的长度。

空间复杂度:O(n),其中 n 是数组 array 的长度。

解法2:双指针

如果发现有偶数出现在奇数的前面,交换它们。

代码:

class Solution
{
public:
	void reOrderArray(vector<int> &array)
	{
		int n = array.size(), i = 0, j = n - 1;
		while (i < j)
		{
		    // 向后移动 i,直到 array[i] 是偶数
			while (i < j && array[i] % 2)
				i++;
			// 向前移动 j,直到 array[j] 是奇数
			while (i < j && array[j] % 2 == 0)
				j--;
			if (i < j)
				swap(array[i], array[j]);
		}
	}
};

复杂度分析:

时间复杂度:O(n),其中 n 是数组 array 的长度。当两个指针相遇时,走过的总路程长度是 n。

空间复杂度:O(1)。

What’s more?

用函数指针,将判断独立出来,之后修改判断函数就能实现不同的排序。

class Solution
{
private:
	void reOrder(vector<int> &array, bool (*func)(int))
	{
		if (array.empty())
			return;
		int n = array.size(), i = 0, j = n - 1;
		while (i < j)
		{
			// 向后移动 i,直到 array[i] 是偶数
			while (i < j && !func(array[i]))
				i++;
			// 向前移动 j,直到 array[j] 是奇数
			while (i < j && func(array[j]))
				j--;
			if (i < j)
				swap(array[i], array[j]);
		}
	}
	static bool isEven(int n)
	{
		return n % 2 == 0;
	}

public:
	void reOrderArray(vector<int> &array)
	{
		reOrder(array, isEven);
	}
};

注:isEven() 函数前要带 static,不然编译出错。


http://www.kler.cn/news/163078.html

相关文章:

  • 做数据分析为何要学统计学(4)——什么问题适合使用卡方检验?
  • 考研真题数据结构
  • python3安装redis
  • Navicat 技术指引 | 适用于 GaussDB 分布式的模型功能
  • Django的logging-日志模块的简单使用方法
  • 微信小程序网络请求二次封装
  • Java项目开发,业务比较复杂如何减少bug
  • 基于深度学习yolov5实现安全帽人体识别工地安全识别系统-反光衣识别系统
  • ArkTS快速入门
  • CentOS常用基础命令大全(linux命令)2
  • Pycharm Jupyter ModuleNotFoundError 问题解决
  • 【前端】CSS基础(学习笔记)
  • Python合并一个 Excel 里面的多张表
  • 虚幻学习笔记10—C++函数与蓝图的通信
  • django与数据库交互关于当前时间的坑
  • 2023.12.7 关于 MySQL 事务详解
  • C#云LIS系统源码 B/S架构,SaaS模式,可扩展性强
  • 数据结构——二叉树的链式结构
  • pcl-3 pcl结合opencv做svm分类(法向量特征数据)
  • 如何运用gpt改写出高质量的文章 (1)
  • 【计算机网络】应用层电子邮件协议
  • AWS Remote Control ( Wi-Fi ) on i.MX RT1060 EVK - 3 “编译 NXP i.MX RT1060”( 完 )
  • 奇点云2023数智科技大会来了,“双12”直播见!
  • 【游戏引擎 - C#脚本系统】6、C#端调用C++函数
  • 使用 Axios 进行网络请求的全面指南
  • echart中定义brush,默认状态,触发状态
  • MQTT协议对比TCP网络性能测试模拟弱网测试
  • Mybatis XML改查操作(结合上文)
  • SpringBoot集成WebSocket
  • Redis 基础—Redis Desktop Manager(Redis可视化工具)安装及使用教程