经典的算法面试题(1)

题目:


给定一个整数数组 nums,编写一个算法将所有的0移到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
注意:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。
这个问题考察候选人处理数组的能力,以及他们编写高效、优雅代码的能力。在解决问题时,请考虑如何避免不必要的元素移动。

思路:

1、双指针法:
使用两个指针,一个用来遍历数组(遍历指针),另一个指向最新发现的非零元素应当存放的位置(非零指针)。
当遍历指针指向的值不为0时,将其与非零指针指向的值交换,然后非零指针前移。
通过整个数组的遍历,所有非零元素都被推向数组的开头,而0都被留在了数组的末尾。
2、计数零元素法:
首先遍历一次数组,统计出0的个数。
在第二次遍历期间,使用一个新的索引(比如 insertPos),它基于0的计数从数组开头开始移动。
如果遍历到非零元素,就将它放到insertPos的位置,并将insertPos向前移动。
遍历完成后,按照统计出的0的个数,在数组末尾补上0。
3、移动非零元素法:
遍历数组,一旦遇到非0数,就将其移到数组最前方现有非0数的后面。
记录最后一个非0数的位置。
在数组剩余的部分填充0。


每种方法都有其特点,但双指针法在空间和操作复杂度上通常是最优的。这个方法只需要( O(n) )的时间复杂度和( O(1) )的额外空间复杂度。

时间复杂度


1. **双指针法**:时间复杂度为 ( O(n) ),因为只需要遍历一遍数组,n 为数组长度。
2. **计数零元素法**:时间复杂度为 ( O(n) ),即便需要两次遍历(一次计数0的个数,一次移动非零元素),但两次遍历的时间复杂度都是线性的。
3. **移动非零元素法**:时间复杂度也为 ( O(n) ),一次线性遍历即可完成所有非零元素的移动和0的填充。
值得注意的是,尽管所有方法的时间复杂度都是线性的,但实际执行时间可能会因为常数因子和元素实际移动次数的差异而有所不同。在决定使用哪一种方法时,这也是需要考虑的因素之一。

实现代码

1、双指针法

#include <stdio.h>
void moveZeroes(int* nums, int numsSize) {int j = 0; // 指向当前非0元素应该插入的位置for (int i = 0; i < numsSize; ++i) {if (nums[i] != 0) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;j++;}}
}

2、计数零元素法:

#include <stdio.h>
void moveZeroes(int* nums, int numsSize) {int zeroCount = 0; // 计算数组中0的个数for (int i = 0; i < numsSize; i++) {if (nums[i] == 0) {zeroCount++;}}int index = 0;for (int i = 0; i < numsSize; i++) {if (nums[i] != 0) {nums[index++] = nums[i];}}for (int i = index; i < numsSize; i++) {nums[i] = 0;}
}

3、移动非零元素法:

#include <stdio.h>
void moveZeroes(int* nums, int numsSize) {int insertPos = 0; // 指向当前已处理数组的末尾for (int i = 0; i < numsSize; i++) {if (nums[i] != 0) {nums[insertPos++] = nums[i];}}while (insertPos < numsSize) {nums[insertPos++] = 0;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/717677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据处理——一维数组转列向量(分割时间序列为数据块时的问题)

记录在处理数据时被磕绊了一下的一个处理细节。 1.想要达到的要求 在某次滑动窗口取样时间序列数据时&#xff0c;我得到如下一个以一维数组为元素的列表&#xff1a; 对于如上输出列表中的每个一维数组&#xff0c;我希望将其转换为下图中的形式&#xff0c;简单说就是希望他…

【详识JAVA语言】面向对象程序三大特性之三:多态

多态 多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 多态实现条件 在java中要实现多态&#xff0c;必须要满足如下几个条件&#xff0c;缺一不可&#xf…

循环队列与循环双端队列

文章目录 前言循环队列循环双端队列 前言 1、学习循环队列和循环双端队列能加深我们对队列的理解&#xff0c;提高我们的编程能力。 2、本文循环队列使用的是数组&#xff0c;循环双端队列用的是双向链表 3、题目连接&#xff1a;设计循环队列 &#xff0c;设计循环双端队列。 …

【机器学习】有监督学习算法之:支持向量机

支持向量机 1、引言2、决策树2.1 定义2.2 原理2.3 实现方式2.4 算法公式2.5 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;泡澡啊。 小鱼&#xff1a;不去 小屌丝&#xff1a;… 此话当真&#xff1f; 小鱼&#xff1a;此话不假 小屌丝&#xff1a;到底去还是…

什么是支持向量机(Support vector machine)和其原理

作为机器学习的基础算法&#xff0c;SVM被反复提及&#xff0c;西瓜书、wiki都能查到详细介绍&#xff0c;但是总是觉得还差那么点&#xff0c;于是决定自己总结一下。 一、什么是SVM&#xff1f; 1、解决什么问题&#xff1f; SVM&#xff0c;最原始的版本是用于最简单的线…

总结 HashTable, HashMap, ConcurrentHashMap 之间的区别

1.多线程环境使用哈希表 HashMap 不行,线程不安全 更靠谱的,Hashtable,在关键方法上加了synchronized 后来标准库又引入了一个更好的解决方案;ConcurrentHashMap 2.HashMap 首先HashMap本身线程不安全其次HashMap的key值可以为空&#xff08;当key为空时&#xff0c;哈希会…

【Java数据结构】——五道算法题让你灵活运用Map和Set

目录 一.只出现一次的数字 二.宝石与石头 三.旧键盘 四.给定一个数组&#xff0c;统计每个元素出现的次数 五.前K个高频单词 一.只出现一次的数字 136. 只出现一次的数字 - 力扣&#xff08;LeetCode&#xff09; 算法原理&#xff1a;我们将nums中每个元素都存入到set中…

ASUS华硕天选5笔记本电脑FX607JV原装出厂Win11系统下载

ASUS TUF Gaming F16 FX607JV天选五原厂Windows11系统 适用型号&#xff1a; FX607JU、FX607JI、FX607JV、 FX607JIR、FX607JVR、FX607JUR 下载链接&#xff1a;https://pan.baidu.com/s/1l963wqxT0q1Idr98ACzynQ?pwd0d46 提取码&#xff1a;0d46 原厂系统自带所有驱动、…

python自动化学习--3.8python操作EXCEL文件python日志收集处理

1、Excel文件处理 安装 openpxl 第三方库 openpxl 模块三大组件: 1、工作簿 &#xff08;包含多个sheet工作表&#xff09; 2、工作表 &#xff08;某个数据包含在某个工作表&#xff09; 3、单元格 1、创建excel工作簿 import openpyxl"""Excel表格的创建…

GotoXy控制台光标的位置更新

光标控制解释 控制台的光标更新方法, 用于控制数据输出位置 void gotoXY(int x, int y)//新函数&#xff1a;更新光标 {COORD c;c.X x;c.Y y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c); }代码解释 这段代码定义了一个名为 gotoXY 的函数&#xff0c;…

【Spring Boot】实现全局异常处理

1.定义基础异常接口类 /*** description: 服务接口类* author: MrVK* date: 2021/4/19 21:39*/ public interface BaseErrorInfoInterface {/*** 错误码* return*/String getResultCode();/*** 错误描述* return*/String getResultMsg(); } 2.定义错误处理枚举类 /*** desc…

小伙伴询问AI该怎么学习?本人的一点总结,以思维导图呈现

如有需要思维导图的在后台请留邮箱&#xff0c;相关知识结构目录 部分导图

nn.Linear() 使用提醒

原本以为它是和nn.Conv2d()一样&#xff0c;就看第二个维度的数值&#xff0c;今天才知道&#xff0c;它是只看最后一个维度的数值&#xff01;&#xff01;&#xff01; 例子1 Descripttion: Result: Author: Philo Date: 2024-02-27 14:33:50 LastEditors: Philo LastEditT…

如何使用“Ubuntu 20.04桌面版,安装MariaDB数据库“?win10系统?

1、更新软件包 sudo apt update 2、 安装MariaDB服务器和客户端 sudo apt install mariadb-server mariadb-client 3、 查看MeriaDB是否运行 service mysql status :q"退回命令行状态 4、 设置MariaDB root用户的密码 sudo mysql_secure_installation 5、 MariaD…

斐波那契数列模型----三步问题

面试题 08.01. 三步问题 - 力扣&#xff08;LeetCode&#xff09; 1、状态表示&#xff1a; 题目要求&#xff1a;上到n阶台阶&#xff0c;有多少种方法。那么n逐渐简化&#xff0c;上1阶台阶有多少种方法&#xff1b;上2阶台阶有多少种方法……直到上n阶台阶有多少种方法。 …

代码随想录第45天|● 70. 爬楼梯 (进阶) ● 322. 零钱兑换 ● 279.完全平方数

文章目录 ● 70. 爬楼梯 &#xff08;进阶&#xff09;思路&#xff1a;- 排列 先value后weight代码&#xff1a; ● 322. 零钱兑换思路&#xff1a;代码 ● 279.完全平方数思路&#xff1a;代码 ● 70. 爬楼梯 &#xff08;进阶&#xff09; 思路&#xff1a;- 排列 先value后…

如何提升计算机性能

04 穿越功耗墙&#xff0c;我们该从哪些方面提升“性能”&#xff1f; 上一讲&#xff0c;在讲 CPU 的性能时&#xff0c;我们提到了这样一个公式&#xff1a; 程序的 CPU 执行时间 指令数CPIClock Cycle Time 这么来看&#xff0c;如果要提升计算机的性能&#xff0c;我们可以…

基于ZYNQ的PCIE高速数据采集卡的设计(一)

作为信息处理的第一步&#xff0c;数据采集的作用越来越重要。目前&#xff0c;数据采集已经在航 空、民用、军事、医疗等领域得到广泛应用。随着相关技术的不断发展&#xff0c;信号频率越 来高&#xff0c;带宽越来越大&#xff0c;使得数据采集技术逐渐向高速大数据的方向…

幻兽帕鲁专用服务器搭建之Linux部署配置教程

大家好我是飞飞&#xff0c;上一期我分享了Windows系统的幻兽帕鲁服务器搭建教程。因为幻兽帕鲁这游戏对服务器的配置有一定的要求&#xff0c;很多小伙伴就寻思用Linux系统搭建占用会不会小一点&#xff1f;有计算机基础的小伙伴都知道Linux系统和Windows系统相比&#xff0c;…

【Linux】实时查看服务器信息

查看服务器CPU使用率 使用命令mpstat 1。这里的1表示每隔1秒更新一次CPU使用率。如果系统未安装mpstat&#xff0c;可以通过安装sysstat包来获取它。 在基于Debian的系统&#xff08;如Ubuntu&#xff09;上&#xff0c;使用命令&#xff1a; sudo apt-get update sudo apt-…