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

经典的算法面试题(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;}
}

相关文章:

经典的算法面试题(1)

题目&#xff1a; 给定一个整数数组 nums&#xff0c;编写一个算法将所有的0移到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 注意&#xff1a;必须在原数组上操作&#xff0c;不能拷贝额外的数组。尽量减少操作次数。 这…...

微信小程序 --- mobx-miniprogram miniprogram-computed

1.1 mobx-miniprogram 介绍 目前已经学习了 6 种小程序页面、组件间的数据通信方案&#xff0c;分别是&#xff1a; 数据绑定&#xff1a;properties获取组件实例&#xff1a;this.selectComponent()事件绑定&#xff1a;this.triggerEvent()获取应用实例&#xff1a;getApp(…...

【HTML】HTML基础2(一些常用标签)

目录 例子 首先是网页图标 然后是一些常用标签 插入图片 例子 <!DOCTYPE html> <html><head><link rel"icon" href"img/银河护卫队-星爵.png" type"image/x-icon"><meta charset"utf-8"><title>…...

Jmeter 安装

JMeter是Java的框架&#xff0c;因此在安装Jmeter前需要先安装JDK&#xff0c;此处安装以Windows版为例 1. 安装jdk&#xff1a;Java Downloads | Oracle 安装完成后设置环境变量 将环境变量JAVA_HOME设置为 C:\Program Files\Java\jdk1.7.0_25 在系统变量Path中添加 C:\Pro…...

控制液压比例插装阀放大器

比例阀放大器接收来自控制器的低功率电信号&#xff0c;并将其转换为足以驱动比例阀的高功率信号。与传统的开关型电磁铁不同&#xff0c;比例电磁铁可以实现连续控制&#xff0c;允许阀门在开和关之间进行无级调节&#xff0c;从而实现更精细的流量和压力控制。一个完整的电液…...

[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…...

nftables 测试一拒绝所有流量

要配置 nftables 先拒绝所有流量&#xff0c;然后再添加允许的规则&#xff0c;您可以按照以下步骤操作&#xff1a; 创建一个空的 nftables 配置文件&#xff08;例如 /etc/nftables.conf&#xff09;并添加如下内容&#xff1a; flush rulesettable inet filter {chain input…...

练习 3 Web [ACTF2020 新生赛]Upload

[ACTF2020 新生赛]Upload1 中间有上传文件的地方&#xff0c;试一下一句话木马 txt 不让传txt 另存为tlyjpg&#xff0c;木马文件上传成功 给出了存放目录&#xff1a; Upload Success! Look here~ ./uplo4d/06a9d80f64fded1e542a95e6d530c70a.jpg 下一步尝试改木马文件后缀…...

Linux中docker项目提示No such file or directory

本来以为是文件权限问题&#xff0c;后来发现是个非常蠢的问题 文件没有映射到容器中 docker文件映射语法 Docker 使用 -v 或 --volume 参数来指定文件映射。 增加在运行命令后 -v <宿主机目录>:<容器目录> 其中&#xff0c;宿主机目录 是指要映射的宿主机上的…...

PyTorch 中的 apply

Abstract nn.Module[List].apply(callable)Tensor.apply_(callable) → TensorFunction.apply(Tensor...) nn.Module[List].apply()? 源码: def apply(self: T, fn: Callable[[Module], None]) -> T:"""Typical use includes initializing the paramete…...

张宇30讲学习笔记

初等数学 x \sqrt{x} x ​是算数平方根&#xff0c;一定≥0&#xff1b; x 2 \sqrt{x^2} x2 ​|x| x2|x2||x|2 x3≠|x3||x|3 不等式 a>0&#xff0c;b>0&#xff0c;则ab≥2 a b \sqrt{ab} ab ​ 对数 ln a b \frac{a}{b} ba​lna-lnb 高等数学 单调性 线性代数...

SpringBoot接口防抖(防重复提交)的一些实现方案

前言 啥是防抖 思路解析 分布式部署下如何做接口防抖&#xff1f; 具体实现 请求锁 唯一key生成 重复提交判断 前言 作为一名老码农&#xff0c;在开发后端Java业务系统&#xff0c;包括各种管理后台和小程序等。在这些项目中&#xff0c;我设计过单/多租户体系系统&a…...

Qt/C++音视频开发67-保存裸流加入sps/pps信息/支持264/265裸流/转码保存/拉流推流

一、前言 音视频组件除了支持保存MP4文件外&#xff0c;同时还支持保存裸流即264/265文件&#xff0c;以及解码后最原始的yuv文件。在实际使用过程中&#xff0c;会发现部分视频文件保存的裸流文件&#xff0c;并不能直接用播放器播放&#xff0c;查阅资料得知原来是缺少sps/p…...

【Web】速谈FastJson反序列化中TemplatesImpl的利用

目录 简要原理分析 exp 前文&#xff1a;【Web】关于FastJson反序列化开始前的那些前置知识 简要原理分析 众所周知TemplatesImpl的利用链是这样的&#xff1a; TemplatesImpl#getOutputProperties() -> TemplatesImpl#newTransformer() -> TemplatesImpl#getTransl…...

RK3568 RK809电源管理 RTC功能使能 定时唤醒

概述 RK809 是一款高性能 PMIC,RK809 集成 5 个大电流 DCDC、9 个 LDO、2 个 开关SWITCH、 1个 RTC、1个 高性能CODEC、可调上电时序等功能。 系统中各路电源总体分为两种:DCDC 和 LDO。两种电源的总体特性如下(详细资料请自行搜索): DCDC:输入输出压差大时,效率高,但…...

大模型(LLM)的token学习记录-I

文章目录 基本概念什么是token?如何理解token的长度&#xff1f;使用openai tokenizer 观察token的相关信息open ai的模型 token的特点token如何映射到数值&#xff1f;token级操作&#xff1a;精确地操作文本token 设计的局限性 tokenizationtoken 数量对LLM 的影响训练模型参…...

探索前景:机器学习中常见优化算法的比较分析

目录 一、介绍 二、技术背景 三、相关代码 四、结论 一、介绍 优化算法在机器学习和深度学习中至关重要&#xff0c;可以最小化损失函数&#xff0c;从而改善模型的预测。每个优化器都有其独特的方法来导航损失函数的复杂环境以找到最小值。本文探讨了一些最常见的优化算法&…...

基于MRI的阿尔兹海默症病情预测

《阿尔兹海默症病情预测系统&#xff1a;老年痴呆患者的福音》 引言项目背景和意义数据介绍与分析模型介绍模型训练与评估模型应用与展望 引言 阿尔兹海默症&#xff08;Alzheimer’s Disease&#xff09;是一种常见的老年疾病&#xff0c;给患者及其家庭带来了巨大的困扰和负…...

高维中介数据: 联合显着性(JS)检验法

摘要 中介分析在流行病学和临床试验中越来越受到关注。在现有的中介分析方法中&#xff0c;流行的联合显着性&#xff08;JS&#xff09;检验会产生过于保守的 I 类错误率&#xff0c;因此功效较低。但是&#xff0c;如果在使用 JS 测试高维中介假设时&#xff0c;可以准确控制…...

冒泡排序 和 qsort排序

目录 冒泡排序 冒泡排序部分 输出函数部分 主函数部分 总代码 控制台输出显示 总代码解释 冒泡排序优化 冒泡排序 主函数 总代码 代码优化解释 qsort 排序 qsort 的介绍 使用qsort排序整型数据 使用qsort排序结构数据 冒泡排序 首先&#xff0c;我先介绍我的冒泡…...

基于RTK-GPS与ResNet50的自主草坪清扫机器人系统设计与实践

1. 项目概述与核心挑战在公园维护的日常工作中&#xff0c;草坪垃圾清理是一项既耗费人力又效率低下的重复性劳动。传统的清扫方式要么依赖人工&#xff0c;要么使用大型、笨重且可能损伤草皮的设备。我们团队的目标&#xff0c;是设计并实现一个能够自主、高效且温和地完成这项…...

UE5.3与VS2022编译配置深度优化指南

1. 为什么UE5项目在VS2022里编译慢、报错多、改个头文件就全量重编&#xff1f;我第一次把团队刚升级的UE5.3项目拖进Visual Studio 2022时&#xff0c;整整等了17分42秒才完成首次编译——不是链接&#xff0c;是编译。中间还弹出6个“LNK2019未解析外部符号”、3个“C2039‘G…...

JWT签名机制与常见攻击实战:从PortSwigger靶场12关学透算法混淆、密钥混淆与JWKS劫持

1. 为什么JWT不是“加密令牌”&#xff0c;而是“签名凭证”——从PortSwigger靶场第一关开始讲起很多人一看到JWT就下意识觉得&#xff1a;“这是个加密的token&#xff0c;只要我拿到它&#xff0c;就等于拿到了用户密码或者敏感密钥。”这种误解直接导致他们在实战中反复碰壁…...

线性化多噪声训练:提升混沌系统长期预测稳定性的正则化技术

1. 项目概述&#xff1a;当机器学习遇上混沌&#xff0c;如何让预测“长治久安”&#xff1f;在天气预报、气候模拟乃至金融市场分析中&#xff0c;我们常常需要面对一类“混沌系统”。这类系统的特点是&#xff0c;其短期行为虽然遵循确定的规律&#xff0c;但长期演化对初始条…...

为什么有些论文,答辩老师越听越不敢卡?

很多学生都经历过一种很明显的反差。有些同学一进答辩室&#xff0c; 老师状态特别紧。问题一个接一个&#xff1b; 追问不断&#xff1b; 语气越来越严肃。但还有一种情况。有些同学刚讲几分钟&#xff0c; 现场气氛就明显变了。老师开始点头&#xff1b; 追问越来越少&#x…...

实际开发中 SQL 与产品的耦合与互动实践

引言 在产品开发初期,数据库 Schema(表结构)的设计是一个绕不开的核心问题。很多开发者,尤其是新手,常常会陷入一个两难境地:“Schema 需要一开始就完全确定好吗?如果后期要改动怎么办?到底要设计多少个表(Schema 数量)才算合适?” 这些问题背后,反映的是对软件工…...

原来训大模型,就像开一家小餐馆!

你是不是一直觉得&#xff0c;训练大语言模型是 OpenAI、百度这种大厂才能干的事&#xff1f;要几万张显卡&#xff0c;要花几个亿&#xff0c;普通人想都不敢想&#xff1f; 错了&#xff01;我用自己开发机上的 8 张 H20 显卡&#xff0c;花了点时间&#xff0c;从零开始训了…...

ThingsVis v1.1.15 版本更新:补齐嵌入与运维体验短板,多场景集成更可靠

ThingsVis v1.1.15&#xff1a;嵌入与运维体验的全面升级ThingsVis v1.1.15 版本以 ThingsVis 嵌入能力和设备详情页体验为核心进行更新。在 ThingsVis 嵌入方面&#xff0c;支持全屏、自动播放、剪贴板写入权限&#xff0c;修复 iframe 无法全屏问题&#xff1b;在设备详情页&…...

牛牛走迷宫【牛客tracker 每日一题】

牛牛走迷宫 时间限制&#xff1a;1秒 空间限制&#xff1a;256M 网页链接 牛客tracker 牛客tracker & 每日一题&#xff0c;完成每日打卡&#xff0c;即可获得牛币。获得相应数量的牛币&#xff0c;能在【牛币兑换中心】&#xff0c;换取相应奖品&#xff01;助力每日有…...

专业级EdgeRemover配置指南:5种高效部署方案深度解析

专业级EdgeRemover配置指南&#xff1a;5种高效部署方案深度解析 【免费下载链接】EdgeRemover A PowerShell script that correctly uninstalls or reinstalls Microsoft Edge on Windows 10 & 11. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRemover EdgeR…...