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.pswp.cn/news/396068.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396068.shtml
英文地址,請注明出處:http://en.pswp.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().更新&…