1. 程式人生 > 實用技巧 >【筆記】簡單難度面試題

【筆記】簡單難度面試題

牛妹的禮物

眾所周知,牛妹有很多很多粉絲,粉絲送了很多很多禮物給牛妹,牛妹的禮物擺滿了地板。地板是N×M的格子,每個格子有且只有一個禮物,牛妹已知每個禮物的體積。地板的座標是左上角(1,1) 右下角(N, M)。牛妹只想要從屋子左上角走到右下角,每次走一步,每步只能向下走一步或者向右走一步或者向右下走一步,每次走過一個格子,拿起(並且必須拿上)這個格子上的禮物。
牛妹想知道,她能走到最後拿起的所有禮物體積最小和是多少?

輸入
[[1,2,3],[2,3,4]]
輸出
7
思路:dp,初始化d[0][i]和dp[i][0],然後將其他格子所代表的禮物數值轉為最短路徑(下、右、右下)的數值,隨後輸出最右下角數值即可。
核心程式碼:

dp[0][0]=presentVolumn[0][0];  
    //初始化第0行
    for(int i=1;i<w;++i)
        dp[0][i]=dp[0][i-1]+presentVolumn[0][i];
    //初始化第0列
    for(int i=1;i<h;++i)
        dp[i][0]=dp[i-1][0]+presentVolumn[i][0];
    //計算內部值
    for(int i=1;i<h;++i)
        for(int j=1;j<w;j++)
            dp[i][j]=min(dp[i-1][j-1],min(dp[i][j-1],dp[i-1][j]))+presentVolumn[i][j];

牛妹的蛋糕

眾所周知,牛妹非常喜歡吃蛋糕。
第一天牛妹吃掉蛋糕總數三分之一(向下取整)多一個,第二天又將剩下的蛋糕吃掉三分之一(向下取整)多一個,以後每天吃掉前一天剩下的三分之一(向下取整)多一個,到第n天準備吃的時候只剩下一個蛋糕。牛妹想知道第一天開始吃的時候蛋糕一共有多少呢?

輸入
2
輸出
3
同樣是dp,因為確定第n-1天剩餘為1(第n天準備吃也就是還沒吃)因此dp[n-1]=1;依次往前推
第i天的剩餘量:dp[i]=(dp[i-1]×2/3)-1,那麼 我們從後往前推時,
第i天的初始量:dp[i]=(dp[i+1]+1)×3/2;
核心程式碼:

  int cakeNumber(int n){  
    if(n<0)   
        return 0;
    int dp[100];
            dp[n-1]=1;
        for(int i=n-2;i>=0;i--)
        {
            dp[i]=(dp[i+1]+1)*3/2;
        }
        return dp[0];

神奇的數字

在這個特殊的假期裡,由於牛牛在家特別無聊,於是他發明了一個小遊戲,遊戲規則為:將字串數字中為偶數位的數字進行翻轉,將翻轉後的結果進行輸出。
輸入
"1234"
輸出
"1432"
說明
第2、4位為偶數,所以將其翻轉後,得到 1432
思路:分別從前往後找偶數以及從後往前找偶數,找到之後即對兩者交換,並修改指標。
核心程式碼:

  //已知數字串string number
  int len=number.size();
    int i=0,j=len-1;
    while(i<j)
    {
        while(i<j&&(number[i]-'0')&1)
            i++;
        while(i<j&&(number[j]-'0')&1)
            j--;
        if(i<j)
            swap(number[i++],number[j--]);
    }
    return number;
}