• <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   管理


            久久超碰97人人做人人爱| 精品熟女少妇av免费久久| 色婷婷久久久SWAG精品| 久久久久亚洲国产| 国产精品久久亚洲不卡动漫| 999久久久免费国产精品播放| 伊人久久成人成综合网222| 久久午夜无码鲁丝片| 人妻无码久久精品| 久久99精品国产一区二区三区| 久久综合色区| 成人精品一区二区久久久| 亚洲中文字幕久久精品无码喷水| 亚洲国产成人久久精品影视| 中文字幕乱码久久午夜| 久久婷婷五月综合色99啪ak| 久久久久免费精品国产| 国产精品久久久久影院色| 色偷偷88欧美精品久久久| 精品永久久福利一区二区| 久久久久亚洲AV成人网人人网站 | 久久一区二区免费播放| 精品国际久久久久999波多野 | 久久久免费精品re6| 亚洲精品视频久久久| 久久国产影院| 久久久久亚洲AV成人网人人软件 | 久久久久国产一级毛片高清板| 996久久国产精品线观看| 日日躁夜夜躁狠狠久久AV| 久久精品国产久精国产果冻传媒| 四虎影视久久久免费| 三级片免费观看久久| 久久强奷乱码老熟女| 无码乱码观看精品久久| 亚洲欧美日韩精品久久亚洲区| 久久婷婷五月综合成人D啪| 日本高清无卡码一区二区久久| 亚洲国产日韩欧美久久| 久久精品青青草原伊人| 蜜臀av性久久久久蜜臀aⅴ|