1. <tt id="5hhch"><source id="5hhch"></source></tt>
    1. <xmp id="5hhch"></xmp>

  2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

    <rp id="5hhch"></rp>
        <dfn id="5hhch"></dfn>

      1. 求職寶典

        4.11 淘寶招聘筆試經驗及講解

        記淘寶2011實習招聘筆試
        2011年03月27日 星期日

        選擇題
        第一題,兩臺電腦在局域網中,機器為千兆網卡,一臺作服務器里面有一張網頁為1K字節,問另一臺下載這個網頁的速度。
        我答:我不知道1K是指1024還是1000…不過按我的算法沒區別,1000 000000/8/1k
        我選了10 000張/秒
        第二題,單鏈表插入一個節點的問題。在p指向的節點后插入一個q指向的節點。
        我答:q->next=p->next;p->next=q;
        之后亂序,我記不清楚題號了。

        有一題,地圖染色問題,每個國家用矩形表示,讓相鄰國家顏色不同。離散里面有
        有一題,問快速排序達到最壞情況時間復雜度n2的原數數組的具體情形。見數據結構
        有一題,很扯的…指針取址符號混亂,選項卻很白癡。
        有一題,入棧序列1,2,3,4,5,..,n,第一個出棧的是n,問第i個出棧的是多少。
        我答:n-i+1
        最后一題,給中綴和后綴表達式,求前綴表達式。

        填空題
        第一題:數組(a1,a2,a3,a4..,an),刪除任意一個的概率相同,問平均刪除一個要移動多少個。
        我答:(n-1)/2
        第二題:一個程序填空,程序大意是在數組里面找第二大的數。
        注:不難

        第三題:大致如下一個程序片段:
        void xxx(x)
        {
        intcountx=0;
        while(x)
        {
        countx++;
        x=x&(x-1);
        }
        cout<<countx<<endl;
        }
        問xxx(9999)輸出什么。
        我答:8,記得做ACM的時候碰到過那個式子,貌似關于排列的,具體意思忘記了,搞一下可以明白是x變成二進制,里面有多少個1就是答案。

        第四題:大致如下一個代碼
        inta[3][2]={1,2,3,4,5,6};
        int*p[3];
        p[0]=a[1];
        問*(p[0]+1)是個什么東西
        我答:4,蠻基礎嗯。

        簡答題
        第一題:7公斤米,50克砝碼,200克砝碼各一個,稱1350克米問最少要多少次,并編程回答。
        我答,6次,可能一開始會想到 1350/250 + 2 = 7次,說明貪心無效。我不知道我的方法是不是很笨,用了遞推,或者你可以看成是動態規劃。轉化一下題目的意思就是1克和4克砝碼,問多少次稱出27克大米,F[N]代表N克大米最少需要多少次。
        則有:
        F[N]=min{F[N-1],F[N-4],F[N-5]}+1
        代碼如下:
        intfindmin(int weight)
        {
        int v= weight/50;
        int f[150];
        f[0]=0;f[1]=1;f[2]=2;f[3]=3;f[4]=1;
        if (v<5) return f[v];
        int i;
        for (i=5;i<=v;i++)
        f[i]=min(f[i-1]+1,f[i-4]+1,f[i-5]+1);
        return f[v];
        }

        注:我一開始愣了很久,我在想,稱好的大米可以作為砝碼來用嗎??這樣就是另一種問題了吧。
        附加:
        如果天平能做為平衡工具的話,兩次平分到1750克,然后兩次量出200克,1750-400就是1350克了。。。四次。。。。

        解答題第一題:
        第一次:200+50,稱出250g 第二次:200+250,稱出450 第三次:200+450,稱出650共稱出1350g

        第二題,有N個蛋和M個籃子,把蛋放到M個籃子里,每個籃子都不能為空。另外,需要滿足:任意一個小于N的正整數,都能由某幾個籃子內蛋的數量相加的和得到。寫出程序,使得輸入一個(N,M),輸出所有可能的分配情況。 我答:不能想出算出所有擺放方法的方法,期待ACM大牛路過。
        (1. 先取M個蛋放入M個籃子(一個籃子一個蛋)
        2.剩下的(N-M)個蛋按照1,2,4,。。方式依次維持各個籃子中蛋的數量(要有一個籃子保持只有一個蛋),若最后的蛋不是2的方次,有多少放入一個籃子
        3.取L(L<=N)個蛋時,應按二進制編碼值考慮,如13個蛋:13的二進制碼值是1101,則取有8個、4個和1個蛋的籃子即可。
        另外:題目不完整,N與M應該有數量關系:M<=N且N<2的M次方)
        解答1
        view plaincopy to clipboardprint?
        /**
        * 假設 n>m 并且 n小于100
        public class Test {
        private int m;
        private int n;
        private int eggs[];
        private int numAnswer;

        Test(){
        m=10;
        n=20;
        numAnswer=0;
        eggs = new int[m];
        for(int i=0;i<m;i++){
        eggs[i]=0;
        }
        }
        private void fill(boolean [] state, int step, int sum){
        if(step>=m){
        state[sum] = true;
        return ;
        }
        fill(state,step+1,sum);
        fill(state,step+1,sum+eggs[step]);
        }

        /**
        * 判斷是否滿足:任意一個小于N的正整數,都能由某幾個籃子內蛋的數量相加的和得到
        * 算法:暴力枚舉所有籃子的組合
        * @return
        */
        private boolean judge(){
        boolean [] state = new boolean [n+1];
        for(int i=0;i<=n;i++){
        state[i] = false;
        }

        fill(state,0,0);

        for(int i=1;i<=n;i++){
        if(!state[i]){
        return false;
        }
        }
        return true;
        }

        /**
        * 給每個籃子分雞蛋,升序(后一個籃子的雞蛋必須不小于前一個籃子,避免重復計算)
        * @param pre 前一個籃子雞蛋數
        * @param already 前step個籃子 已使用的雞蛋數
        * @param step 第step個籃子
        */
        public void solve(int pre,int already, int step){
        if(step==m-1){
        //最后一個籃子
        eggs[m-1]=n-already;
        //不符合條件
        if(eggs[m-1]<pre) return;

        //判斷是否滿足:任意一個小于N的正整數,都能由某幾個籃子內蛋的數量相加的和得到
        if(judge()) {
        for(int i=0;i<m;i++){
        System.out.print(eggs[i]+" ");
        }
        System.out.println();
        numAnswer++;
        }
        return ;
        }

        // 給第step個籃子裝雞蛋,pre 到 n-already 種可能
        for(int i=pre; i<=n-already; i++){
        eggs[step]=i;
        //遞歸
        solve(i,already+i,step+1);
        }
        }
        public static void main(String arg [] ){
        Test test = new Test();
        test.solve(1,0,0);
        System.out.println("可能情況的數量:"+test.numAnswer);
        }
        }

         

        解答2
        using System;
        using System.Collections.Generic;
        using System.Text;
        namespace CmpSplitEgg
        {
        class Program
        {
        static void Main(string[] args)
        {
        SplitEgg();
        }

        public static bool SplitEgg()
        {
        // 初始化變量,差額diffNum = 雞蛋數eggNum - 籃子數basketNum
        int eggNum = 0, basketNum = 0, diffNum;
        // 輸入雞蛋數、籃子數
        Input(ref eggNum, ref basketNum);
        // 排列結果,并初始化
        int[] resultEggs = new int[basketNum];
        for(int i=0;i<basketNum;i++)
        {
        resultEggs[i] = 1;
        }

        // 差額 = 雞蛋數 - 籃子數
        diffNum = eggNum - basketNum;
        if (diffNum < 0)
        {
        Console.WriteLine("You can't make N < M");
        return DoAgain() && SplitEgg();
        }
        else if (Math.Pow(2, basketNum) <= eggNum)
        {
        Console.WriteLine("You can't make N > 2^M");
        return DoAgain() && SplitEgg();
        }

        // 對任意一個小于N的數 總能使幾個籃子里的雞蛋總數等于它,則需要編號n的籃子放的雞蛋數<=前面的雞蛋數總和+1
        // 基于2進制編碼是能表示所有數字且位數最小的編碼方式,上面條件由此推出
        // 假設組合為升序排列,第一個籃子必然為1個雞蛋
        RandomLay(resultEggs, 1, eggNum);

        // 是否重新做一次
        return DoAgain() && SplitEgg();
        }

        /// <summary>
        /// 重新選擇
        /// </summary>
        public static bool DoAgain()
        {
        Console.WriteLine();
        Console.WriteLine("if you want to enter the N and M again?Yes(Note: if not enter 'Y' or 'y', the application will quit...)");
        string choice = Console.ReadLine();
        return choice.ToLower() == "y";
        }

        /// <summary>
        /// 輸入
        /// </summary>
        /// <param name="eggNum">雞蛋數量</param>
        /// <param name="basketNum">籃子數量</param>
        public static void Input(ref int eggNum, ref int basketNum)
        {
        while (true)
        {
        try
        {
        Console.WriteLine("Please enter the egg number N:");
        eggNum = Convert.ToInt32(Console.ReadLine());
        Console.WriteLine("Please enter the basket number M:");
        basketNum = Convert.ToInt32(Console.ReadLine());
        break;
        }
        catch (Exception)
        {
        Console.WriteLine("Enter error: please input integer!");
        Console.WriteLine();
        continue;
        }
        }
        }

        /// <summary>
        /// 隨即放置雞蛋
        /// </summary>
        /// <param name="result">結果</param>
        /// <param name="beginIndex">開始索引</param>
        /// <param name="total">雞蛋數</param>
        public static void RandomLay(int[] result, int index, int total)
        {
        // iMax為index對應可取雞蛋數上限
        int iMax = 1, basketNum = result.Length;
        for (int j = 0; j < index; j++)
        {
        iMax += result[j];
        }

        // 復制
        int[] copyResult = new int[basketNum];
        for (int i = 0; i < basketNum; i++)
        {
        copyResult[i] = result[i];
        }

        // 結束條件1:已為最后一個籃子
        if (index == basketNum - 1)
        {
        int mBasket = total - iMax + 1;
        if (mBasket <= iMax)
        {
        copyResult[index] = mBasket;
        Console.Write("Split solution: ");
        foreach (int res in copyResult)
        Console.Write(res + " ");
        Console.WriteLine();
        }
        return;
        }
        for (int ii = copyResult[index - 1]; ii <= iMax; ii++)
        {
        // 結束條件2:當前至少需要雞蛋數
        int nowNum = ii * (basketNum - index) + iMax - 1;
        // 表示無法再按升序放置雞蛋
        if (nowNum > total)
        break;
        copyResult[index] = ii;
        RandomLay(copyResult, index + 1, total);
        }
        }
        }
        }

        解答3
        [code=C/C++][/code]#include<iostream>
        #include<math.h>
        #include<malloc.h>
        #include<fstream>
        using namespace std;

        struct solution
        {
        int *ptr;
        struct solution *next;
        };
        typedef struct solution solu;

        int* first(int n,int m); //計算出第一種組合
        solu* others(int n,int m,solu *head,solu *prior); //計算出其他組合
        int sum(int n,int *p); //計算前n-1個籃子里的蛋數和
        bool only(solu *head,int *p,int m); //檢查組和是否滿足要求
        int ways; //全局變量,保存組合的方法數

        void main()
        {
        int n=0,m=0,i=0,k=0;
        solu *head=NULL;
        solu *temp=NULL;
        LABLE: cout<<"輸入雞蛋數N=";
        cin>>n;
        cout<<"輸入籃子數M=";
        cin>>m;
        if(m<=0||n<=0||m>n||(double)n>=pow(2.0,m)) //對m,n的約束
        {
        cout<<"輸入不合法!"<<endl;
        goto LABLE;
        }
        cout<<"正在計算..."<<endl;
        head=others(n,m,head,NULL); //調用others開始計算
        temp=head;
        ofstream file("D:\\egg.txt"); //結果保存著這個目錄下
        cout<<"共有"<<ways<<"種組合方式:"<<endl;
        file<<"共有"<<ways<<"種組合方式:"<<endl;
        k=ways;
        while(temp!=NULL&&ways)
        {
        cout<<"方式"<<k-ways+1<<":"<<endl;
        file<<"方式"<<k-ways+1<<":"<<endl;
        for(i=0;i<m;i++)
        {
        cout<<*(temp->ptr+i)<<" ";
        file<<*(temp->ptr+i)<<" ";
        }
        delete[] temp->ptr;
        temp=temp->next;
        cout<<endl;
        file<<endl;
        ways--;
        }
        file.close();
        cout<<"操作結果保存在D://egg.txt,您可以查看或刪除之。";
        cin>>i;
        }

        int sum(int n,int *p) //計算前n-1個籃子里的總蛋數
        {
        int total=0;
        for(int i=0;i<n;i++)
        {
        total+=*(p+i);
        }
        return total;
        }
        int* first(int n,int m)
        {
        int *p,i=0,temp1=0,temp2=0;
        p=(int *)malloc(m*sizeof(int));
        for(i=0;i<m;i++) //每個籃子里放一個蛋
        {
        *(p+i)=1;
        }
        //下面的分配滿足的條件:
        //“總能找到幾個籃子,使里面雞蛋的和等于任意一個小于n的正整數”
        //下面的if~else語句完成一種組合,升序排列,并使后面的籃里的蛋盡量多
        if(n-m>m-1)
        //剩下的蛋數大于前面m-1個籃子里的蛋數和,
        {
        *(p+m-1)+=m-1;
        while(sum(m,p)<n) //還有蛋剩余
        {
        temp1=n-sum(m,p); //剩蛋數
        for(i=m;i>0;)
        {
        temp2=sum(i-1,p); //第i個籃子前面的所有籃子里的蛋數的總和
        if(*(p+i-1)<=temp2)
        //第i個籃子里的蛋數小于等于前面籃子里蛋的總數,給這個籃里加蛋
        //否則,見else
        {
        if(temp1<=temp2-*(p+i-1)+1) //剩下的蛋可以全部放到第i個籃里,完畢
        {*(p+i-1)+=temp1;break;}
        else {*(p+i-1)+=temp2-*(p+i-1)+1;break;} //在第i個籃子放可能達到的最多蛋數
        }
        else i--; //檢測前面那個籃子
        }
        }

        }
        else *(p+m-1)+=n-m;
        //剩下的蛋數小于等于前面m-1個籃子里的蛋數和,
        //把所有的蛋都放到最后一個籃里,完成一種組合。
        return p;

        }

        solu* others(int n,int m,solu* head,solu *prior)
        {
        int i=0,j=0,k=0;
        if(head==NULL) //還沒有任何組合
        {
        solu *s=new(solu);
        s->ptr=first(n,m); //調用first()生成滿足后面的值最大的升序序列
        head=s;
        head->next=NULL;
        prior=head;
        ways=1;
        }
        for(j=m-1;j>0;j--) //兩重循環,開始計算其他組合
        //原理是從后面的籃子里取出雞蛋放入前面的籃子中
        {
        if(*(prior->ptr+j)==1) //后面的籃子里蛋數為1,跳出循環
        break;
        for(i=j-1;i>0;i--) //一個個往前挨
        {
        if(*(prior->ptr+j)-1>*(prior->ptr+i)) //后面的籃子減掉后不能比前面的少,保持升序排列
        {
        int *p=(int *)malloc(m*sizeof(int));
        for(k=0;k<m;k++)
        {
        (*(p+k))=(*(prior->ptr+k));
        }
        (*(p+j))--;(*(p+i))++;
        if(only(head,p,m)) //檢查是否滿足條件,滿足則將結果添加到鏈表中
        {
        solu *stemp=new(solu);
        stemp->ptr=p;
        stemp->next=head->next;head->next=stemp;
        head=others(n,m,head,stemp);
        ways++;
        }
        else delete[] p;

        }
        else if(*(prior->ptr+j)-1==*(prior->ptr+i))
        continue;
        else
        break;
        }
        }
        return head;
        }
        bool only(solu *head,int *p,int m) //判斷條件是否符合
        {
        solu *s=head;
        int flag=0,i=0;
        for(int k=0;k<m-1;k++)
        {
        if(*(p+k+1)<*(p+k)||*(p+k+1)>sum(k+1,p)+1) //兩個條件:1、升序,2、后面的數必須小于等于前面的籃子總數和加1
        return false;
        }
        while(s!=NULL) //判斷是否有過相同的組合,有則返回false
        {
        flag=0;
        for(i=0;i<m;i++)
        {
        if(*(s->ptr+i)!=*(p+i))
        {
        flag=1;
        break;
        }
        }
        if(!flag)
        {
        return false;
        }
        s=s->next;
        }
        return true; //檢查通過,返回true
        }

        任意給定的M 和N, 假定雞蛋已經全部按規定放好了,那么如果能取出X個雞蛋(0<X< M)那么剩下的就是M-X個雞蛋,也相當于取出了M-X個雞蛋。所以只需要考慮能夠取到1到M/2個雞蛋即可。

        又如有的哥們講的1,2,4,8.。。2^(k-1)這樣數列比較特殊,有k位這樣的數列,可從中取出若干個數相加得到任意小于2^k-1的數(因為K位這樣的數列相加的和為2^k - 1),那么依照題意我們應該從這樣的數列開始考慮。

        現在有N個籃子,先拿掉一個籃子。那么這N-1個籃子按上面的方法放雞蛋的話可表示出所有小于2^(N-1)-1的數,如果2^(N-1)-1 > M/2那么該題有解,否則無解。

        情況一 M > 2^(N-1)-1 > M/2
        給N-1個籃子中分別放1,2,4,8....2^(N-2)個雞蛋,剩下的雞蛋全部放最后一個籃子里。
        由于前N-1個籃子可表示任意小于M/2的數,所以這N個籃子可表示所有小于M的數。如果不考慮籃子的編號和順序,此情況只有一種放法。
        情況二 2^(N-1)-1 > M
        按上面的方法還沒放到第N-1個籃子雞蛋就沒了,那么這時的做法是,先按上面的方法放好所有雞蛋。假設放到第x個籃子雞蛋就沒了,那么從x+1個籃子開始回頭從x籃子里拿一個雞蛋放入其中,然后是x+2籃子同樣的處理,依次類推。如果x籃子中只剩一個雞蛋了還有籃子是空的,那么從x-1籃子中取雞蛋。依次類推放滿所有籃子。按這種方法如果N=M,則每個籃子放一個雞蛋。如果不考慮籃子的編號和順序則方法是很有限的,也就是將雞蛋在幾個籃子里倒來倒去。

        可以看出此算法的復雜度只有N,根本不需要遞歸什么的。老太太按這種方法操作也能很快得出一個解。

        也可以看出給定若干個雞蛋,至少需要多少個籃子才能滿足題目要求,比如100個雞蛋就最少需要7個籃子 500個雞蛋最少需要9個籃子,1000個雞蛋最少需要10個籃子

        第三題,大意淘寶網的評論系統,原先只有一個評論表,對于現在大用戶,大數據量,大訪問量,請設計一個合理可行的架構來優化關于評論的數據庫。
        我答:哥蒙了,哥胡言亂語的。

        附加題:前端設計師必答
        第一題:圖片默認為半透明,鼠標移上去變成不透明。
        我注:img標簽onfocus和onblur的應用,注意這個透明的屬性在IE和FireFox下是不同的。而且用js控制的時候,屬性名也要注意…

        第二題:一個輸入框,和一個列表框,列表框里面有很多字符串,在輸入框里面輸入字符串時,列表框中字符串前綴是該字符串的做高亮或者其他顯著表示。最后回車選擇或者鼠標雙擊列表框選擇。
        我注:看上去要寫不少東西啊……實在懶了。

        總結:
        基礎偏多,大題很算法,很偏實際應用,前面不會不應該了,后面看造化,畢竟時間也不多。
        最后:如果有錯,請指正,僅給路人或未來想進淘寶的孩子或八卦的朋友做些參考。

         

        Copyright©2006-2024應屆畢業生網yjbys.com版權所有

        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码

        1. <tt id="5hhch"><source id="5hhch"></source></tt>
          1. <xmp id="5hhch"></xmp>

        2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

          <rp id="5hhch"></rp>
              <dfn id="5hhch"></dfn>