• <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)。請(qǐng)給出算法和程序,統(tǒng)計(jì)哪些數(shù)字沒有出現(xiàn),哪些數(shù)字出現(xiàn)了多少次。能夠在O(n)的時(shí)間復(fù)雜度,O(1)的空間復(fù)雜度要求下完成么


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

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


            確定了題意,基于之前的思考,我的算法是這樣的遍歷一遍數(shù)組,用-2,-1,0來表示沒有出現(xiàn),出現(xiàn)一次,出現(xiàn)多次,如果當(dāng)前節(jié)點(diǎn)大于0,目標(biāo)節(jié)點(diǎn)為它對(duì)應(yīng)的值,當(dāng)前置為-2,若小于0,加一但不要超過0。算法需要一個(gè)遞歸函數(shù)(用來遞歸處理目標(biāo)節(jié)點(diǎn)一直大于0的情況,即未處理過的)和一個(gè)遍歷的函數(shù)。最終0即為多次出現(xiàn),-1出現(xiàn)1次的,-2沒有出現(xiàn)。因?yàn)橛?個(gè)前提這個(gè)算法才有效: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 閱讀(706) | 評(píng)論 (0)編輯 收藏

            2013年8月2日 #

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

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

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

            最多需要3只就夠了,9宮格。ABC 和 ABC,每只鼠負(fù)責(zé)一橫一豎,這樣每一瓶都至少有2只喝過,除了對(duì)角線上,如果是對(duì)角線上只會(huì)死一只,其余都是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)在可以通過死掉老鼠的情況推斷出哪一瓶有問題了,對(duì)吧。

            更新:
            多謝@geagle9。的提醒,確實(shí)存在問題,2和4都是A和B死。嗚嗚!!之前的算法錯(cuò)誤嘍。。

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

            其實(shí)我一直有個(gè)不明白的是,一共11個(gè)瓶子,為啥只要找出9個(gè)沒有毒的就可以了。答案是要2個(gè)一組,分6組,這樣的話,用3個(gè)老鼠能定位到每一組,這個(gè)時(shí)候肯定是有一組有問題的,但不管是哪一組,至少能有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 閱讀(289) | 評(píng)論 (0)編輯 收藏

            2013年8月1日 #

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

            2013年7月19日 #

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

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

            2013年7月18日 #

                 摘要: #面試編程題#一 個(gè)不能少:有k個(gè)有序的數(shù)組,請(qǐng)找到一個(gè)最小的數(shù)字范圍。使得這k個(gè)有序數(shù)組中,每個(gè)數(shù)組都至少有一個(gè)數(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 閱讀(311) | 評(píng)論 (0)編輯 收藏

            2013年7月17日 #

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

             

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

             

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

             

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

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

            2013年7月13日 #

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

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

            既然我們只是要找出括號(hào)有沒有匹配就行了,那我們用一種方式記下左括號(hào)和右括號(hào)的次數(shù)不就可以了,例如left_count, right_count。它們的差為0不就好了?只要不為0,肯定就不匹配了,對(duì)吧?更進(jìn)一步,為啥非要用2個(gè)變量呢,一個(gè)就夠了嘛。遇到左括號(hào)++,遇到右括號(hào)--,最后為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 閱讀(819) | 評(píng)論 (1)編輯 收藏

            2013年7月12日 #

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

            第一個(gè),不重復(fù),很簡(jiǎn)單,用二分查找就OK了。對(duì)吧

             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 }

            第二個(gè),可重復(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 閱讀(448) | 評(píng)論 (1)編輯 收藏

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

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

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


            這是一輪partition之前和之后的圖示,之后就對(duì)于(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 閱讀(2887) | 評(píng)論 (0)編輯 收藏

            2013年7月3日 #

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

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

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

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

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


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

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

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

            僅列出標(biāo)題  下一頁
            爱做久久久久久| 久久男人AV资源网站| 久久99国产综合精品女同| 69久久精品无码一区二区| 国产亚洲成人久久| 精品国产99久久久久久麻豆| 国产精品成人久久久久三级午夜电影 | 久久天天躁狠狠躁夜夜网站 | 四虎国产永久免费久久| 亚洲午夜无码AV毛片久久| 人妻精品久久久久中文字幕69| 亚洲国产成人久久精品影视| 久久99国产精品久久99小说 | 久久久久亚洲?V成人无码| 亚洲成色www久久网站夜月| 国内精品免费久久影院| 久久国产精品成人影院| 色婷婷久久综合中文久久一本| 国内精品久久久久久99| 久久人妻AV中文字幕| 精品久久久久久国产免费了| 久久久精品人妻一区二区三区蜜桃| 久久九九免费高清视频| 国产精品福利一区二区久久| 国产偷久久久精品专区| 久久久久国产精品三级网| 久久无码av三级| 久久久精品午夜免费不卡| 亚洲色大成网站WWW久久九九| 久久综合视频网站| 久久男人中文字幕资源站| 亚洲一区中文字幕久久| 国产精品99久久久久久人| 久久青青草原亚洲av无码app| 亚洲色婷婷综合久久| 久久综合综合久久综合| 色欲av伊人久久大香线蕉影院| 麻豆av久久av盛宴av| 香蕉久久夜色精品国产2020| 久久亚洲高清综合| 亚洲欧美国产日韩综合久久|