• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 183,  comments - 10,  trackbacks - 0
            下午網(wǎng)宿的一個(gè)面試題目,當(dāng)時(shí)沒(méi)有答好。先分析如下:

            刪除 vector 中大于 n 的數(shù),注意 vector 中并不一定存在 n + 1
            最簡(jiǎn)單的做法是循環(huán),逐個(gè)掃描,到檢查到有大于 n 的元素時(shí),移動(dòng)后面的元素。這里有另種掃描方式,分別是從左到右和從右到左。
            從右到左的方式效率更高,因?yàn)楸苊饬艘苿?dòng)其他大于 n 的元素。但是兩種方式的時(shí)間復(fù)雜度都是 O(N ^ 2)。

            可以通過(guò)先排序然后找到第一個(gè)大于 n 的元素的迭代器,然后刪除該迭代器到最后一個(gè)元素之間的元素。
            但是這種方法改變?cè)瓉?lái)小于等于 n 的元素之間的相對(duì)順序。
            查找第一個(gè)大于 n 的元素的迭代器是先要排序,然后查找。
            查找的方法有,直接循環(huán)遍歷查找。也可以傳一個(gè)函數(shù),用 find_if。也可以用函數(shù)對(duì)象,函數(shù)對(duì)象的函數(shù)時(shí)你可以自己設(shè)定想要的參數(shù),還是用 find_if 查找。
            這種方法的時(shí)間復(fù)雜度是 O(NlogN)。

            第三種方法是利用 remove_if 函數(shù),但是 remove_if 函數(shù)不會(huì)真的刪除元素,需要借助于 erase 函數(shù)。但是 remove_if 操作的效率和第一種是一樣的,時(shí)間復(fù)雜度還是 O(N^2)。

            實(shí)現(xiàn):
              1 #include <iostream>
              2 #include <vector>
              3 #include <algorithm>
              4 using namespace std;
              5 
              6 // 從左向右掃描刪除移動(dòng)
              7 void delLeftToRight(vector<int>& data, int n)
              8 {
              9     for (size_t i = 0; i < data.size(); ++i)
             10     {
             11         if (data[i] > n)
             12         {
             13             for (size_t j = i + 1; j < data.size(); ++j)
             14             {
             15                 data[j - 1= data[j];
             16             }
             17             data.pop_back();
             18             --i;
             19         }
             20     }
             21 }
             22 
             23 // 從右向左掃描刪除移動(dòng)
             24 void delRightToLeft(vector<int>& data, int n)
             25 {
             26     for (size_t i = data.size(); i > 0--i)
             27     {
             28         if (data[i - 1> n)
             29         {
             30             for (size_t j = i; j < data.size(); ++j)
             31             {
             32                 data[j - 1= data[j];
             33             }
             34             data.pop_back();
             35         }
             36     }
             37 }
             38 
             39 // 排序,順序遍歷查找,刪除
             40 void delSort(vector<int>& data, int n)
             41 {
             42     sort(data.begin(), data.end());
             43     vector<int>::const_iterator cit = data.begin();
             44     for (; cit != data.end(); ++cit)
             45     {
             46         if (*cit > n)
             47         {
             48             break;
             49         }
             50     }
             51     data.erase(cit, data.end());
             52 }
             53 
             54 class biggerN
             55 {
             56     int m;
             57 public:
             58     biggerN(int i) : m(i) {}
             59     bool operator ()(int n)
             60     {
             61         return n > m;
             62     }
             63 };
             64 
             65 bool bigger(int n)
             66 {
             67     return n > 10;
             68 }
             69 
             70 // 排序,查找,刪除
             71 void delSortFind(vector<int>& data, int n)
             72 {
             73     sort(data.begin(), data.end());
             74     vector<int>::const_iterator cit;
             75     cit = find_if(data.begin(), data.end(), biggerN(n));
             76     // cit = find_if(data.begin(), data.end(), bigger);
             77     data.erase(cit, data.end());
             78 }
             79 
             80 // 移動(dòng),刪除
             81 void delRemove(vector<int>& data, int n)
             82 {
             83     data.erase(remove_if(data.begin(), data.end(), biggerN(n)), data.end());
             84     // data.erase(remove(data.begin(), data.end(), 20), data.end());
             85 }
             86 
             87 void display(const vector<int>& data)
             88 {
             89     for (size_t i = 0; i < data.size(); ++i)
             90     {
             91         cout << data[i] << ' ';
             92     }
             93     cout << endl;
             94 }
             95 
             96 int main()
             97 {
             98     vector<int> data;
             99     for (int i = 20; i > 0--i)
            100     {
            101         data.push_back(i);
            102     }
            103     // data.push_back(20);
            104     display(data);
            105     // delLeftToRight(data, 10);
            106     // delRightToLeft(data, 10);
            107     // delSort(data, 10);
            108     // delSortFind(data, 10);
            109     delRemove(data, 10);
            110     display(data);
            111 }

            posted on 2011-05-21 00:18 unixfy 閱讀(1272) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            久久精品国产一区| 国内精品久久人妻互换 | 香蕉久久夜色精品国产2020| 久久综合视频网站| 婷婷久久精品国产| 热99re久久国超精品首页| 青青久久精品国产免费看 | 国产精品无码久久四虎| 亚洲精品午夜国产VA久久成人| 青青青国产成人久久111网站| 亚洲成av人片不卡无码久久 | 久久久久亚洲av无码专区喷水| 久久这里只有精品久久| 久久人人爽人人人人爽AV| 国产免费久久精品99久久| 精品久久久久久国产潘金莲| 亚洲美日韩Av中文字幕无码久久久妻妇| 色偷偷偷久久伊人大杳蕉| 久久久久亚洲精品无码网址| 热re99久久6国产精品免费| 精品久久人人妻人人做精品| 久久精品麻豆日日躁夜夜躁| 国产亚洲精久久久久久无码77777| 久久久久国产精品| 日韩精品国产自在久久现线拍 | 国产2021久久精品| 成人久久综合网| 国产午夜福利精品久久2021| 久久综合亚洲色一区二区三区| 深夜久久AAAAA级毛片免费看 | 色婷婷久久综合中文久久蜜桃av | 热久久国产精品| 久久久中文字幕| 2022年国产精品久久久久| 精品少妇人妻av无码久久| 国产精品久久久久久久久免费| 久久久精品人妻一区二区三区蜜桃| 无码专区久久综合久中文字幕 | 99久久精品国产一区二区| 久久久久亚洲AV无码专区首JN| 久久久久这里只有精品 |