js 数组遍历符合条件跳出循环体_C++模拟面试:从数组“紧凑”操作说开来

38c3b620259e6c683e3781cb38049671.png

面试官

自来也

去掉一个字符串中的空格。

假设用C语言来解答,字符串是char数组。O(n)时间复杂度实现不难,比如额外申请一个新数组,然后遍历一遍字符串,将符合条件的字符存储到新数组中,实现起来很简单。

但这显然不能让面试官满意。其实可以不开辟新数组空间实现。用两个变量i,j做游标,从前向后遍历。也算是算法题中“双指针”解法的一种题型了。

    char s[] = "1  2 3   4 5";    int sz = strlen(s);    int i = 0, j = 0;    for (; j < sz; j++) {        if (s[j] != ' ') {            s[i] = s[j];            i++;        }    }    s[i] = '\0';

题目二

38c3b620259e6c683e3781cb38049671.png

面试官

自来也

一个整数数组,将0排到前面,非0在后,非0的相对顺序不变。

本题和上一题思路相同,只是两个游标从后向前。另外注意最后不要忘记给数组头部的元素设置0。

    int num[] = {1, 0, 0, 3, 0, 0, 0, 4, 5, 0, 2};    int n = sizeof(num)/sizeof(int);    int i = n - 1, j = n - 1;    for (; j >= 0; j--) {        if (num[j] != 0) {            num[i] = num[j];            i--;        }    }    for (; i >= 0 ; i--) {        num[i] = 0;    }

这两个面试题其实也是工作中针对数组、链表的一种常见操作的简易表达。有时候我们从线性容器中删除元素,当时只是打上一个标记,并未真正删除,也未改变容器结构。在后面一个适当的时候,做一次处理,一次性批量地剔除本已删除的元素。彼时这个操作便是『compact』,或翻译成『紧凑』操作。

说开来

38c3b620259e6c683e3781cb38049671.png

面试官

自来也

其实这个假删除,后来再compact的操作,在STL中早有体现,你了解吗?

C++ STL中的算法函数std::remove()便是如此,用remove来删除vector中元素时,它不会真的移除元素,它既不改变end()迭代器,也不改变成员函数size()、capacity()的值!

而且它不是将待删除元素交换到末尾,其只是做单向复制,比如vector 存储{0,1,0,3,12} 使用remove算法删除0后则是 {1,3,12,3,12}。最后两个元素3和12其实已然多余。

如果想要真的删除需要借助vector成员函数erase()。std::remove()执行完毕会返回一个迭代器,该迭代器指向首个被复制到尾部的元素的位置,也就是从这个位置到vector的end(),都是无效的元素,可被删除!

vector<int> v;// 删除0v.erase(remove(v.begin(), v.end(), 0), v.end());

std::remove()也可以操作list容器,效果同vector,也不是真实删除。但list其实提供了成员函数list::remove(),可以做删除操作,且是真实删除。另外list也有list::erase()成员函数.对于list而言,list::remove()和list::erase()的区别是:

remove()接收的参数是元素的值,而erase()接收的是迭代器,这点和vector相同。

关联容器(比如map)其删除函数的也名为erase(),接收迭代器参数,也是真实删除。

你会发现STL中erase()都是按迭代器来做删除(vector、list、map都有erase()成员函数),而remove()是按值删除(list成员函数或std::remove())。

注意,如果在for循环中做顺序容器的删除操作,那么for循环的括号中,就不要做迭代器的累加操作了。这样很容易出问题,一般把迭代器的累加操作放到循环体中。

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

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

相关文章

项目NABCD的分析

N&#xff1a;你的创意解决了用户的什么需求 本项目解决了在校大学生和社会工程人士在计算一些工程测量中的需求&#xff0c; 可以通过自己提供的一些测得的已知数据来推算出自己想要的数据结果&#xff0c; 比用户自己手动计算更有效更快更节省时间 A&#xff1a;有什么招数来…

git 命令git 地址_这是我上周使用的所有Git命令及其作用。

git 命令git 地址by Sam Corcos由Sam Corcos 这是我上周使用的所有Git命令及其作用。 (Here are all the Git commands I used last week, and what they do.) Like most newbies, I started out searching StackOverflow for Git commands, then copy-pasting answers, witho…

两个队列实现一个栈思路c语言,两个栈实现队列功能C语言实现能运行!

#include#includetypedef struct sq{char *ps;int top;int Maxsize;}stack;void initstack(stack *s,int ms){s->ps(char*)malloc(ms*sizeof(char));s->top-1;s->Maxsizems;};void push(stack *s,char val){if(s->tops->Maxsize-1){printf("栈已满\n"…

基本入门程序编写格式和注意事项

在安装好JDK后联系程序的基本写法。1、先创建记事本&#xff0c;如果有超级记事本如:notepad、ultraedit、editplus等更好。重命名把记事本后面的后缀名改为.java 但是值得注意的是要看看自己创建的记事本文档是否是隐藏后缀名的。要是有设置隐藏的就取消隐藏&#xff0c;以免混…

.dll文件存在但是不显示_一招巧妙解决U盘内文件明明存在,打开U盘而内容却不显示的问题...

大家可能都遇到过这种情况&#xff0c;就是说U盘中明明有文件&#xff0c;但是插在电脑上就是什么文件都没有&#xff0c;一片空白&#xff0c;这样的问题对于那些对文件很重要且仅保存了1份的人来说是很.kongbu.&#xff0c;因为U盘中的内容都是命根子。给大家介绍绝对有用的解…

《java入门第一季》之面向对象(包概述)

由于eclipse等ide的强大功能&#xff0c;使得建包&#xff0c;导包用一些快捷键就能完成。这里对包的概念做稍微的叙述&#xff0c;了解即可&#xff1a; 分包后使得项目更加清晰&#xff0c;提高代码维护性。 包&#xff1a; A:其实就是文件夹 B:作用 …

Vue 框架-05-动态绑定 css 样式

Vue 框架-05-动态绑定 css 样式 今天的小实例是关于 Vue 框架动态绑定 css 样式&#xff0c;这也是非常常用的一个部分 首先说一下 动态绑定&#xff0c;相对的大家都知道静态绑定&#xff0c;静态绑定的话&#xff0c;直接加 class“”就可以了&#xff0c;使用 Vue 呢之前也介…

ember.js_如何设置基本的Ember.js应用

ember.jsby Tracy Lee | ladyleet特雷西李(Tracy Lee)| Ladyleet 如何设置基本的Ember.js应用 (How to set up a Basic Ember.js app) So, you want to test out Ember, eh? This article will walk through building a basic app.所以&#xff0c;您想测试Ember&#xff0c;…

分数转小数C语言,这是把小数转换成分数的程序,可是输入0.6666无限循环

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include int main(){double a;scanf("%lf", &a);输入小数int b, c 0, d 0;double b1 a;do{b1 *10;b (int)b1;printf("%d\n", b);if(b%10!0){c;if(d>0){c d;d 0;}}else{d;}}while(d<5);printf("…

arm处理器的历史及现状

1 arm处理器的发展历史 arm1 arm2 arm3 arm6 arm7 arm9 arm11 arm cortex 2 arm处理器现状 arm cortex A a即application&#xff0c;即应用处理器&#xff0c;主要用在智能手机、平板电脑和服务器上。 arm cortex M m即mcu&#xff0c;即单片机上的处理器&#xff0c;它的特点…

Linq常用List操作总结,ForEach、分页、交并集、去重、SelectMany等

1 /*2 以下围绕Person类实现&#xff0c;Person类只有Name和Age两个属性3 一.List<T>排序4 1.1 List<T>提供了很多排序方法&#xff0c;sort(),Orderby(),OrderByDescending().5 */6 7 lstPerson lstPerson.OrderByDescending(x>x.Name).ToList(); //降序8 ls…

bool查询原理 es_ES系列之原理copy_to用好了这么香

写在前面Elasticsearch(以下简称ES)有个copy_to的功能&#xff0c;之前在一个项目中用到&#xff0c;感觉像是发现了一个神器。这个东西并不是像有些人说的是个语法糖。它用好了不但能提高检索的效率&#xff0c;还可以简化查询语句。基本用法介绍直接上示例。先看看mapping&am…

加密算法—MD5、RSA、DES

最近因为要做一个加密的功能&#xff0c;简单了解了一下加密算法&#xff0c;现在比较常用的有三个加密算法MD5加密算法、RSA加密算法、DES加密算法。 MD5加密算法 定义&#xff1a;MD5算法是将任意长度的“字节串”变换成一个128bit的大整数&#xff0c;并且它是一个不可逆的字…

随机加密_随机艺术和加密圣诞树

随机加密When I first learned how to code, one of my first tasks was setting up an SSH key so I could use encryption to securely connect to my friend’s Linux server.当我第一次学习如何编码时&#xff0c;我的第一个任务是设置SSH密钥&#xff0c;以便可以使用加密…

用c语言编写一个2048 游戏,求c语言编写的2048游戏代码,尽量功能完善一些

正在编写中&#xff0c;请稍后&#xff01;追答 : 代码来了&#xff01;有点急&#xff0c;没做界面。追答 : 2048_launcher。c&#xff1a;#include#include#includevoid main(){printf("正在启动中&#xff0c;请稍后&#xff01;");Sleep(1000);system("bin\…

MySQL之数据库对象查看工具mysqlshow

mysqlshow&#xff1a;数据库对象查看工具&#xff0c;用来快速查找存在哪些数据库、数据库中的表、表中的列或索引。选项&#xff1a;--count 显示数据库和表的统计信息-k 显示指定的表中的索引-i 显示表的状态信息不带任何参数显示所有数据库[rootwww mys…

软件工程分组

电子零售系统 陈仔祥 孟拓 陈庚 汪力 郭澳林 崔祥岑 刘校 肖宇 武清 胡圣阳转载于:https://www.cnblogs.com/2231c/p/9960751.html

vnr光学识别怎么打开_干货|指纹锁的指纹识别模块的前世今生,智能锁的指纹识别到底有多智能?...

智能锁现在也有很多叫法&#xff1a;指纹锁、电子锁。可见指纹识别是智能锁的核心功能了&#xff0c;那我们今天来聊聊智能锁的指纹识别模块。指纹识别的历史指纹识别认证的流程指纹识别技术的种类指纹识别的历史早在2000多年前我国古代的人就将指纹用于签订合同和破案了&#…

使用Kakapo.js进行动态模拟

by zzarcon由zzarcon 使用Kakapo.js进行动态模拟 (Dynamic mocking with Kakapo.js) 3 months after the first commit, Kakapo.js reaches the first release and we are proud to announce that now it is ready to use. Let us introduce you Kakapo.首次提交3个月后&#…

android ble 实现自动连接,Android:自动重新连接BLE设备

经过多次试验和磨难之后,这就是我最好让Android自动连接的唯一用户操作是首先选择设备(如果使用设置菜单然后首先配对).您必须将配对事件捕获到BroadcastReceiver中并执行BluetoothDevice.connectGatt()将autoconnect设置为true.然后当设备断开连接时,调用gatt.connect().更新&…