283. Move Zeroes (Vector的erase和remove)

Given an array nums, write a function to move all 0's to the end of it while maintaining the relative order of the non-zero elements.

For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3, 12, 0, 0].


1.算法
    void moveZeroes(vector<int>& nums) {
        int m=0;
        for(int i=0;i<nums.size();i++){
            if(nums[i]==0) m++;
        }
        nums.erase(remove(nums.begin(),nums.end(),0),nums.end());
        for(int j=0;j<m;j++){
            nums.push_back(0);
        }
    }
2.erase和remove的使用
  • erase()的作用是刪除掉某個位置position或一段區域(begin, end)中的元素,減少其size;
  • remove()只是將待刪除元素之后的元素移動到vector的前端,而不是刪除。操作并不改變vector的size。若要真正移除,需要搭配使用erase()。

舉例:

原vector:{0,1,0,3,12}

使用remove(nums.begin(),nums.end(),0) 后 變為 [1,3,12,3,12];
簡要地說,remove移動指定區間中的元素直到所有“不刪除的”元素在區間的開頭(相對位置和原來它們的一樣)。它返回一個指向最后一個的下一個“不刪除的”元素的迭代器。返回值是區間的“新邏輯終點”;remove遍歷這個區間,把要“刪除的”值覆蓋為后面要保留的值。這個覆蓋通過對持有被覆蓋的值的元素賦值來完成。
至于操作后的結果是: “不刪除的”元素在v中的v.begin()和newEnd之間,“刪除的”元素就必須在newEnd和v.end()之間——這好像很合理。事實上不是這樣。

  • 要正真刪除東西的話,你應該在remove后面接上erase,就如上面
    nums.erase(remove(nums.begin(),nums.end(),0),nums.end());
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,766評論 0 33
  • 前言: 詳細介紹: List:元素有放入順序,元素可重復Map:元素按鍵值對存儲,無放入順序Set:元素無放入順序...
    YBshone閱讀 8,703評論 0 17
  • 標簽(空格分隔): STL 運用STL,可以充分利用該庫的設計,讓我為簡單而直接的問題設計出簡單而直接的解決方案,...
    認真學計算機閱讀 1,498評論 0 10
  • 如果每次做事情時總有一個跟自己唱反調的是什么感受?這個唱反調的又總是自己這又是一種什么感受? 我是一個85后,如今...
    尚宇領域閱讀 586評論 0 0
  • 不愛就毀滅吧。 現在是七點五十分,還有三分鐘,列車將停靠浙江站。突然疲憊一下子全部襲來,這些年許多往事飛速涌入腦海...
    劉啊凡閱讀 1,226評論 4 1