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

            coding everyday

            編程面試題 https://interview.codeplex.com

            C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
              12 Posts :: 2 Stories :: 7 Comments :: 0 Trackbacks

            2013年8月29日 #

            #面試題#給定數(shù)組A,大小為n,數(shù)組元素為1n的數(shù)字,不過有的數(shù)字出現(xiàn)了多次,有的數(shù)字沒有出現(xiàn)。請給出算法和程序,統(tǒng)計哪些數(shù)字沒有出現(xiàn),哪些數(shù)字出現(xiàn)了多少次。能夠在O(n)的時間復(fù)雜度,O(1)的空間復(fù)雜度要求下完成么?


            想了好久,都沒能想出來算法,我覺得是不是自己走進(jìn)死胡同了,決定再看一遍題目,這一遍果然讓我發(fā)現(xiàn),原來自己真的理解錯了題目的意思,我一開始以為要輸出多次出現(xiàn)的數(shù)字對應(yīng)的數(shù)字,所以一直都繞不過來彎。

            所以有時候面試過程中,重新確認(rèn)題目還是有必要的,有時候面試緊張會誤解題目意思,當(dāng)自己沒有思路的時候,可以嘗試確認(rèn)題意,以來可以緩解一下自己的心情,再者可能面試官會跟你有更多的互動,增加好感。


            確定了題意,基于之前的思考,我的算法是這樣的遍歷一遍數(shù)組,用-2,-1,0來表示沒有出現(xiàn),出現(xiàn)一次,出現(xiàn)多次,如果當(dāng)前節(jié)點大于0,目標(biāo)節(jié)點為它對應(yīng)的值,當(dāng)前置為-2,若小于0,加一但不要超過0。算法需要一個遞歸函數(shù)(用來遞歸處理目標(biāo)節(jié)點一直大于0的情況,即未處理過的)和一個遍歷的函數(shù)。最終0即為多次出現(xiàn),-1出現(xiàn)1次的,-2沒有出現(xiàn)。因為有2個前提這個算法才有效:1~n;只要出現(xiàn)多次和沒出現(xiàn)的數(shù)字,不需要次數(shù)。

             

             1 #include <iostream>
             2 #include <array>
             3 using namespace std;
             4 
             5 template<int N>
             6 class array_stat {
             7 public:
             8     array_stat(const array<int, N>& arr) : m_arr(arr) {
             9     }
            10 
            11     void operator()() {
            12         for (int i=1; i<=N; i++) {
            13             process(i);
            14         }
            15 
            16         for (int i=0; i<N; i++) {
            17             if (m_arr[i] == 0)
            18                 cout << i+1 << " exists more than once" << endl;
            19             else if (m_arr[i] == -2)
            20                 cout << i+1 << " doesnt exist" << endl;
            21         }
            22     }
            23 private:
            24     array<int, N> m_arr;
            25 
            26     void process(int i) {
            27         if (m_arr[i-1> 0) {
            28             int cur = m_arr[i-1];
            29             m_arr[i-1= -2;
            30             process(cur);
            31         }
            32         else {
            33             m_arr[i-1]++;
            34             if (m_arr[i-1> 0)
            35                 m_arr[i-1= 0;
            36         }
            37     }
            38 };
            39 
            40 int main() {
            41     array<int10> arr = {2143565656};
            42     array_stat<10> stat(arr);
            43     stat();
            44     return 0;
            45 }

            源代碼
            posted @ 2013-08-29 10:24 everyday 閱讀(705) | 評論 (0)編輯 收藏

            2013年8月2日 #

            #面試思考題#可憐的小老鼠:有11瓶酒,只有一瓶有毒。喝酒之后,三天會死,只有三天時間。請問至少需要多少只老鼠,可以找出9瓶沒有毒的酒。關(guān)注微信公眾賬號“待字閨中”,了解和討論參考分析。

            http://www.weibo.com/1915548291/A2QpWmhUH

            分析:
            直覺上應(yīng)該是4只鼠可以找出那瓶有毒的。如果要找出9瓶沒有毒的,肯定不大于4嘛。這個大家能想明白嗎?有人想看分析就回復(fù)哦。:P

            最多需要3只就夠了,9宮格。ABC 和 ABC,每只鼠負(fù)責(zé)一橫一豎,這樣每一瓶都至少有2只喝過,除了對角線上,如果是對角線上只會死一只,其余都是2只,那2只就能定位到哪一瓶了。額。。不知道還有沒有更少的,只需要2只或者1只就搞定的?

              A B C
            A 1 2 3
            B 4 5 6
            C 7 8 9

            A需要喝的是1,2,3,4,7
            B需要喝的是2,4,5,6,8
            C需要喝的是3,6,7,8,9

            現(xiàn)在可以通過死掉老鼠的情況推斷出哪一瓶有問題了,對吧。

            更新:
            多謝@geagle9。的提醒,確實存在問題,2和4都是A和B死。嗚嗚?。≈暗乃惴ㄥe誤嘍。。

            看起來我的9宮格是走不通了,不知道老羅是不是還走的下去。

            其實我一直有個不明白的是,一共11個瓶子,為啥只要找出9個沒有毒的就可以了。答案是要2個一組,分6組,這樣的話,用3個老鼠能定位到每一組,這個時候肯定是有一組有問題的,但不管是哪一組,至少能有9瓶是好的。哎呀媽呀。終于弄出來了。
            1,2 -> A
            3,4 -> B
            5,6 -> C
            7,8 -> A+B
            9,10 -> A+C
            11 ->B+C
            posted @ 2013-08-02 17:26 everyday 閱讀(288) | 評論 (0)編輯 收藏

            2013年8月1日 #

                 摘要: 一座金字塔,從上到下,第一層有一個杯子、第二層有兩個杯子,依次類推。每個杯子的容量為C升,從塔頂?shù)瓜翷升水,當(dāng)1號杯子滿了之后,會等量溢出到2號和3號杯子。當(dāng)2號和3號滿了,2號溢出到4號和5號,3號溢出到5號和6號,注意5號接受來自兩個杯子的水。依次類推。給定C和L,請問,第n杯里有多少水。   閱讀全文
            posted @ 2013-08-01 13:43 everyday 閱讀(429) | 評論 (0)編輯 收藏

            2013年7月19日 #

                 摘要: #面試題#Facebook用戶都是雙向的好友,a是b的好友,那么b一定是a的。給定一個用戶列表,有些用戶是好友,有些不是,請判斷,這些用戶是否可以劃分為兩組,每組內(nèi)的用戶,互相都不是好友。如果能,請給出這個劃分。比如用戶:{1, 2, 3} 好友關(guān)系:1-2, 2-3 劃分:{1,3} {2}。

            題目乍一看,感覺像是圖連通的問題。細(xì)細(xì)品了下,貌似不是滴。  閱讀全文
            posted @ 2013-07-19 09:52 everyday 閱讀(762) | 評論 (0)編輯 收藏

            2013年7月18日 #

                 摘要: #面試編程題#一 個不能少:有k個有序的數(shù)組,請找到一個最小的數(shù)字范圍。使得這k個有序數(shù)組中,每個數(shù)組都至少有一個數(shù)字在該范圍中。例如:1:{ 4, 10, 15, 24, 26 };2: { 0, 9, 12, 20 };3: { 5, 18, 22, 30 }。所得最小范圍為[20,24],其中,20在2中,22在3中,24在1中。  閱讀全文
            posted @ 2013-07-18 10:14 everyday 閱讀(310) | 評論 (0)編輯 收藏

            2013年7月17日 #

            前些天,看到很多大牛就“面試該不該問算法題”進(jìn)行了大量的討論和廝殺,作為小程序員也就看看的份。昨天在微博上看到有個網(wǎng)友對一個面試題做的評論,“如果一個人看過類似解法,能回答出來,一個人沒看過回答不出來,就能說明回答不出來的能力就不如回答出來的嗎?”對此我表示贊同,確實不能說明回答不出的能力不如看過而回答出來的人。

             

            但是如果我是面試官,我肯定會對回答出來的人更有好感。為什么?我沒有理由不對回答出我問題的人欣賞,而對沒有回答出來的人更欣賞嘛,我想這是人之常情吧。我剛才說我贊同,確實不能證明回答出來的人更有能力,假如他是看過的,但是我想至少能說明或許他更勤奮,為了面試做了準(zhǔn)備,平時有這方面的興趣等,難道不是嗎?

             

            退一步講,作為面試官為什么要去證明回答不出的人更有實力呢?這不是應(yīng)該應(yīng)聘者的事嗎?應(yīng)聘者才需要證明自己更有能力勝任這個工作吧?

             

            通常應(yīng)聘者被問到一些自己回答不了的問題之后,會很緊張(更緊張),以至于影響發(fā)揮,完全體現(xiàn)不出自己的實力。其實我倒覺得可以正視自己回答不了的問題,這些只不過是所有面試問題中的一小部分,不如坦白的承認(rèn)這方面自己相對較弱,然后引導(dǎo)面試官問一些自己比較擅長的問題,能體現(xiàn)自己的能力(分析問題解決問題,學(xué)習(xí)能力,編碼能力)的方向。當(dāng)面試官問你一些你不熟悉的問題,坦白說不會,“這個方面我不太熟,但是相關(guān)的,方面,我平時比較關(guān)注,也花了不少時間,有些”(前提是,說實話)這個時候如果面試官也了解這方面,可以深入的問你這方面的問題;即便面試官不了解這方面,也會對你有好感,改善對你的看法。

            posted @ 2013-07-17 09:13 everyday 閱讀(407) | 評論 (0)編輯 收藏

            2013年7月13日 #

            這個問題很簡單,大學(xué)學(xué)數(shù)據(jù)結(jié)構(gòu)的時候,講堆棧一章的時候作為其中一個例子來說的。但是如果面試中被問到這個題,我想用堆棧來做應(yīng)該不能被接受吧,理由是空間和時間的代價都挺高的。

            有沒有稍微好點的算法呢?介紹個時間O(n), 空間O(1)的算法。

            既然我們只是要找出括號有沒有匹配就行了,那我們用一種方式記下左括號和右括號的次數(shù)不就可以了,例如left_count, right_count。它們的差為0不就好了?只要不為0,肯定就不匹配了,對吧?更進(jìn)一步,為啥非要用2個變量呢,一個就夠了嘛。遇到左括號++,遇到右括號--,最后為0即匹配。
             1 bool is_brackets_match(char *const input) {
             2     if (input != nullptr) {
             3         char *p = input;
             4         int count = 0;
             5 
             6         while (*p != '\0') {
             7             if (*p == '(')
             8                 ++count;
             9             else if (*p == ')')
            10                 --count;
            11 
            12             p++;
            13         }
            14 
            15         if (count == 0)
            16             return true;
            17     }
            18     return false;
            19 }
            posted @ 2013-07-13 17:20 everyday 閱讀(818) | 評論 (1)編輯 收藏

            2013年7月12日 #

            #面試編程題#給定一個數(shù)組A,其中有一個位置被稱為Magic Index,含義是:如果i是Magic Index,則A[i] = i。假設(shè)A中的元素遞增有序、且不重復(fù),請給出方法,找到這個Magic Index。當(dāng)A中允許有重復(fù)的元素,該怎么辦呢?

            第一個,不重復(fù),很簡單,用二分查找就OK了。對吧

             1 int find_magic_index2(int *list, int count) {
             2     int low = 0, high = count - 1;
             3     while (high > low) {
             4         int idx = (high + low) / 2;
             5         if (idx == list[idx])
             6             return idx;
             7         else if (list[idx] > idx) {
             8             high = idx - 1;
             9         }
            10         else 
            11             low = idx + 1;
            12     }
            13 
            14     return -1;
            15 }

            第二個,可重復(fù)的,該怎么辦?從頭到尾走一邊,總歸是可以的嘛。:)。我的想法是,如果a[i]等于i的話,找到了;如果大于i的話,讓i=a[i],不然i++繼續(xù)找。這樣最差的情況才是O(n)
            至于為什么可以讓i=a[i],原因由于數(shù)列是遞增的,所以數(shù)組元素在{i, a[i]}的區(qū)間中,肯定不可能存在magic index。這樣看上去是不是跳躍著前進(jìn)啊。:)
             1 int find_magic_index (int *list, int count) {
             2     int i=0;
             3     while (i<count) {
             4         if (list[i] == i)
             5             return i;
             6         else if (list[i] > i)
             7             i = list[i];
             8         else
             9             i++;
            10     }
            11     return -1;
            12 }
            posted @ 2013-07-12 14:25 everyday 閱讀(447) | 評論 (1)編輯 收藏

            單鏈表的快速排序
            單鏈表的快速排序跟數(shù)組的排序原理上一致,有一個分區(qū)(區(qū)分)的函數(shù)在一個區(qū)間中針對某個標(biāo)桿值進(jìn)行區(qū)分,比它大的放它后面,比它小的放它前面,并返回它的地址,好對它前面的以及它后面的遞歸。

            單鏈表的快速排序跟數(shù)組有個明顯的區(qū)別,就是指示起始和終止的元素,在一輪之后它們在鏈表中的位子會發(fā)生改變,所以需要返回一個新的起始的位置(終止的位置)
            我的算法中總是拿后一個的節(jié)點作為終止位置,所以它在鏈表中的位子其實是不改變的,所以我只修改了起始位置指向新的起始位置即可。

            我的算法是,用2個鏈表,一個放比它大的一個放比它小的,最后接起來,它的位置就是mid,而其實位置就是當(dāng)初起始的前一個節(jié)點在新鏈表中的next。有點拗口,就是說a->start->...->nullptr,這一輪傳進(jìn)來的是start,那么經(jīng)過這輪的分區(qū)之后,start的位置肯定改變了,對吧?但是a->next的地址沒有改變,即&(a->next),因為start之前的都會原封不動的放在那里。我覺得用指針的地址來處理是這里的關(guān)鍵之處吧。


            這是一輪partition之前和之后的圖示,之后就對于(begin, mid)和(mid->next, end)進(jìn)行快速排序即可。

             1 // Problem: sort a singly link list by Quick Sort
             2 node *partition(list &l, node *&begin, node *end = nullptr) {
             3     // if end is the next node, that means it's only one node to sort
             4     if (begin == nullptr || end == begin->next) {
             5         return nullptr;
             6     }
             7 
             8     list small_list, big_list;
             9     node *current = l.root;
            10     node *pivot = begin;
            11     node **pbegin;          // points to the address of begin
            12     node **s_current = &small_list.root, **b_current = &big_list.root;
            13 
            14     // move previous nodes before 'begin' to small list
            15     while (current != begin) {
            16         *s_current = current;
            17         s_current = &(*s_current)->next;
            18         current = current->next;
            19     }
            20 
            21     // pbegin presents the location(address) of begin item, e.g. if (a->next == begin) then pbegin = &a->next;
            22     pbegin = s_current;
            23 
            24     while (begin != end) {
            25         if (begin->data < pivot->data) {
            26             *s_current = begin;
            27             s_current = &(*s_current)->next;
            28         }
            29         else {
            30             *b_current = begin;
            31             b_current = &(*b_current)->next;
            32         }
            33 
            34         begin = begin->next;
            35     }
            36 
            37     // pass begin back to quick_sort for next sort action
            38     begin = *pbegin;
            39 
            40     *b_current= end;
            41     *s_current = big_list.root;
            42     l = small_list;
            43     l.print();
            44 
            45     // current pivot would be the end node for smaller set sorting
            46     return big_list.root;
            47 }
            48 
            49 void quick_sort(list &l, node *begin, node *end = nullptr) {
            50     if (begin == end) {
            51         return;
            52     }
            53     // mid represents the pivot node which is the next node of the end of the small list
            54     node *mid = partition(l, begin, end);
            55 
            56     if (mid != nullptr){
            57         quick_sort(l, begin, mid);
            58     }
            59 
            60     if (mid != nullptr &&
            61         mid->next != nullptr) {        
            62         quick_sort(l, mid->next, end);
            63     }
            64 }

            代碼
            posted @ 2013-07-12 13:41 everyday 閱讀(2886) | 評論 (0)編輯 收藏

            2013年7月3日 #

            yeah. 首先要恭喜下自己,昨天的算法蒙對了,請看@陳利人帖子。 【鼓掌】【鼓掌】:)

            經(jīng)典面試題:蓄水池抽樣

            要求從N個元素中隨機(jī)的抽取k個元素,其中N無法確定。

            這種應(yīng)用的場景一般是數(shù)據(jù)流的情況下,由于數(shù)據(jù)只能被讀取一次,而且數(shù)據(jù)量很大,并不能全部保存,因此數(shù)據(jù)量N是無法在抽樣開始時確定的;但又要保持隨機(jī)性,于是有了這個問題。所以搜索網(wǎng)站有時候會問這樣的問題。

            這里的核心問題就是“隨機(jī)”,怎么才能是隨機(jī)的抽取元素呢?我們設(shè)想,買彩票的時候,由于所有彩票的中獎概率都是一樣的,所以我們才是“隨機(jī)的”買彩票。那么要使抽取數(shù)據(jù)也隨機(jī),必須使每一個數(shù)據(jù)被抽樣出來的概率都一樣。


            哎呀媽呀,這題目一天比一天難啊。目測搞不定啊。

            在班車上簡單分析了下,N的值要到最后才知道,從N個里面抽k個元素,要是概率知識沒有都還給老師的話,每個元素被抽中的概率是CNk,對不?唔,既然在N知道之前,就要一樣概率的抽取k個元素,那我能不能猜想最后的算法其實是跟N無關(guān)的呢?不管怎么樣先挖個坑再說,目測這個坑不一定能填上。:D

            posted @ 2013-07-03 09:29 everyday 閱讀(777) | 評論 (1)編輯 收藏

            僅列出標(biāo)題  下一頁
            99久久99久久精品国产片果冻| 91精品国产9l久久久久| 伊人久久一区二区三区无码| 青青草原综合久久大伊人| 亚洲精品无码专区久久久 | 99久久超碰中文字幕伊人| 一级做a爰片久久毛片16| 亚洲国产高清精品线久久 | 国产精品久久久久久久久鸭| 久久99精品久久久久久齐齐| 狠狠色丁香久久婷婷综合图片| 亚洲人成精品久久久久| 一本色道久久88加勒比—综合| 日韩久久久久中文字幕人妻| 精品熟女少妇av免费久久| 国产免费久久精品99re丫y| 久久久久久a亚洲欧洲aⅴ| 久久久亚洲裙底偷窥综合| 国产午夜精品久久久久九九电影| 亚洲精品乱码久久久久久蜜桃不卡 | 久久精品无码午夜福利理论片| 久久国产精品免费一区| 国产精品久久亚洲不卡动漫| 亚洲色婷婷综合久久| 漂亮人妻被中出中文字幕久久| 国产精品青草久久久久福利99| 久久99亚洲网美利坚合众国| 久久久久久久亚洲精品| 国产69精品久久久久99尤物| 久久综合丁香激情久久| 久久99国产精品尤物| 国产精品禁18久久久夂久| 国内精品综合久久久40p| 超级97碰碰碰碰久久久久最新| 久久夜色撩人精品国产| 午夜精品久久久久| 国产欧美久久久精品影院| 亚洲精品美女久久久久99| 久久综合国产乱子伦精品免费| 久久99精品国产麻豆| 99久久无色码中文字幕|