当前位置: 首页 > 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/a/163078.html

相关文章:

  • Android中桌面小部件的开发流程及常见问题和解决方案
  • SOLIDWORKS代理商鑫辰信息科技
  • [CKS] 关闭API凭据自动挂载
  • [CKS] K8S ServiceAccount Set Up
  • 机器学习基础02_特征工程
  • RAFT: Recurrent All-Pairs Field Transforms for Optical Flow用于光流估计的循环全对场变换
  • 做数据分析为何要学统计学(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)