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

            面試題分析小結-3

            33 O(1) 刪除單鏈表中的節點

            常規的方法是從 head 遍歷到待刪除節點 p 的上一個節點 q
            q->next = p->next;
            delete p;
            遍歷到 p 的時間復雜度是 O(N)

            既然知道了 p ,則就可以 O(1) 得到下一個節點 t ,將 t 的值拷貝到 p 所指的節點,然后刪除 t 即可。
            t = p->next;
            p->data = t->data;
            p->next = t->next;
            delete t;
            這樣時間復雜度是 O(1)

            要考慮 p 是不是最后一個節點,但是最終不會影響 O(1) 的時間復雜度

            void delete(node* p, node* head)
            {
             if (p == 0 || head == 0)
             {
              return;
             }
             if (p->next != 0)
             {
              node* t = p->next;
              p->data = t->data;
              p->next = t->next;
              delete t;
              t = 0;
             }
             else
             {
              node * t = head;
              while (t->next != p)
              {
               t = t->next;
              }
              t->next = 0;
              delete p;
              p = 0;
             }
            }

            http://m.shnenglu.com/jake1036/archive/2011/05/21/146879.html

            34 找出數組中唯一出現一次的兩個數
            如果一個數組中其他數都是出現偶數次,只有一個數出現奇數次,則可以直接對這個數組中的所有元素進行異或運算,最終的結果即是這個出現奇數次的數。
            異或運算的特性。

            這里是有兩個數出現了一次,其他數都出現了兩次。
            對整個數組進行異或運算,所得到的結果即是這兩個數的異或值 a ^ b = c

            考慮 c
            考慮 c 的某位為 1 的那位,比如考慮最低的那個為 1 的位
            根據這個位,把原數組分成兩部門,即該位為 1 的集合和為 0 的集合,a 和 b 必然被分開,然后對這兩個集合分別做異或運算,即可得到相應的 a 和 b 。

            異或運算的特性:
            a ^ (全 0) = a
            a ^ (全 1) = ~a
            a ^ a = 0
            偶數個 a 異或 = 0
            奇數個 a 異或 = a

            http://m.shnenglu.com/jake1036/archive/2011/05/21/146881.html

            35 找出兩個鏈表的第一個共同節點
            這個題目也可以簡化為判斷兩個單鏈表是否交叉
            1.
            最直觀的解法是兩個循環,直接檢測,O(M * N)
            2.
            對每個節點的地址哈希 O(M + N)
            3.
            遍歷兩個鏈表,取得長度,然后再次遍歷,先遍歷長的那個鏈表,提前走 t 步,然后共同向后走,檢測第一次兩個節點地址是否一樣,如果一樣,則是那個共同節點。O(M + N)
            4.
            交叉的鏈表是 Y 型的,將其中一個鏈表 a 連到另一個鏈表 b 尾部,從 a 的 head 遍歷,如果再次回到了 a 的 head 即可判定 a 和 b 是交叉的。如果想找到交叉節點,則同時從 a 的 head 和 b 的 head 遍歷,直到 a 的 head 和 b 的 head 遇到一起時,這時 a 的 head 也就是 b 的 head 即是指向的那個公共節點。

            http://m.shnenglu.com/jake1036/archive/2011/05/22/146909.html

            36 在字符串中刪除指定的字符
            給定兩個字符串,刪除第一個字符串中在第二個字符串出現的字符
            例如:
            "abcefgh", "abcef"
            得到:
            "gh"

            先對第二個字符串,做 hash 記錄要刪除的字符
            然后遍歷第一個字符串,根據 hash 表,判斷當前字符是否是要刪除的那個字符
            對第一個字符串的處理,可以利用一個指針和一個已刪除的字符數目記錄
            也可以利用兩個指針,分別記錄當前遍歷的字符和刪除后的字符串記錄

            http://m.shnenglu.com/jake1036/archive/2011/05/22/146944.html
            http://baike.baidu.com/view/15482.htm
            http://zh.wikipedia.org/wiki/ASCII
            http://zh.wikipedia.org/wiki/File:ASCII_Code_Chart-Quick_ref_card.jpg

            posted on 2011-07-23 22:55 unixfy 閱讀(159) 評論(0)  編輯 收藏 引用
            伊人久久久AV老熟妇色| 青青青青久久精品国产h| 欧美日韩精品久久久免费观看| 亚洲成色WWW久久网站| 99久久婷婷国产综合精品草原| 97精品伊人久久久大香线蕉 | 区亚洲欧美一级久久精品亚洲精品成人网久久久久| 日日狠狠久久偷偷色综合96蜜桃 | 久久人人爽人人爽AV片| 久久精品人人做人人爽电影蜜月| 老司机午夜网站国内精品久久久久久久久 | 久久99精品国产99久久| 久久99久国产麻精品66| 久久人人爽人人澡人人高潮AV| 97久久香蕉国产线看观看| 精品久久久久久中文字幕大豆网 | a级毛片无码兔费真人久久| 亚洲国产欧洲综合997久久| 亚洲精品无码久久久| 精品久久久久久久中文字幕| 久久精品国产影库免费看| 久久久噜噜噜久久熟女AA片| 国产精品99久久久久久宅男小说| 久久国产V一级毛多内射| 国内精品伊人久久久久网站| 91久久精品国产91性色也| 99久久伊人精品综合观看| 中文字幕成人精品久久不卡| 99久久精品久久久久久清纯| 91久久婷婷国产综合精品青草| 久久国产乱子伦免费精品| 久久午夜伦鲁片免费无码| 久久这里只有精品18| 国产成人精品综合久久久久| 久久www免费人成看片| 少妇内射兰兰久久| 99久久人妻无码精品系列| 久久精品草草草| 狠狠色综合网站久久久久久久| 久久人妻少妇嫩草AV蜜桃| 久久丫忘忧草产品|