亞馬遜在線筆試(2014/10/9)

亞馬遜的在線筆試也是OJ題目,跟谷歌差很少。固然比較詫異的是,其實難度也跟谷歌差很少!ios

 

第一題:spa

巨麻煩的一道題目,大意是比較撲克牌序列,每一個序列四張牌code

 

規則一:blog

四張牌相同。天然數字大的勝出,好比3,3,3,3 < 6,6,6,6ci

規則二:字符串

四張牌連續。固然序列最大的那個勝出。可是有個小trick,A在這裏默認表最大牌,可是若是後接2,3,4,則A表最小牌,爲了得到連續序列get

好比A,2,3,4 < J,Q,K,Ainput

規則三:string

有三張相同。以每一個序列相同牌較大的勝出。hash

好比3,3,3,2>2,2,2,A

規則四:

兩個對子。固然以對子較大的勝出,最大的對子相同,則以次大的對子較大者勝出。

好比4,4,3,3 > 4,2,4,2

規則五:

一個對子。對子較大者勝出,若是對子相同,則比較剩下較大牌,若是還相同,比較次大牌

3,3,7,4 < 3,3,7,5

規則六:

若是以上皆不知足,則按照大牌>小牌比較(即從最大牌開始比較,分出高下爲止)

 

若是兩個序列不屬於同一規則,則規則小者勝出。

若是序列一大於序列二,輸出1,反之輸出-1;若是序列相同,輸出0。

若是發現做弊,即兩副牌中某張牌數量超過5張,則輸出-2。

 

OK,以上是題目描述。這個題目,我的感受主要是讀懂題意,實現起來確實也很是麻煩,可是沒啥難點,可是也會搞好久。

主要是幾點:

一、解析輸入字符串(若是你用C、C++,會比較蛋疼)

二、適配規則邏輯(更像狀態機)

3,比較邏輯

好像也沒啥是吧,可是本屌絲作了N久才把Case全過。並且代碼巨長,200+行,準備吃飯去了,代碼稍後奉上。

昨晚有事。如今奉上我水的不忍直視的代碼。

#include <iostream>
#include <sstream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
int change(char a)
{
    switch (a)
    {
    case 'A':
        return 14;
        break;
    case 'J':
        return 11;
        break;
    case 'Q':
        return 12;
        break;
    case 'K':
        return 13;
        break;
    default:
        return 0;
        break;
    }
}

int istype(int *a)
{
    int x = a[0];
    int ans = 1;
    int hash[15];
    memset(hash, 0, sizeof(hash));
    for (int i = 0; i < 4; i++)
    {
        hash[a[i]]++;
    }
    int eq = 1;
    int deq = 0;
    for (int i = 1; i < 15; i++)
    {
        if (hash[i] == 4)
            return 1;
        if (hash[i] == 3)
            return 3;
        if (i>1)
        {
            if (hash[i] == hash[i - 1]&&hash[i]==1)
            {
                eq++;
            }
        }

        if (eq == 4)
            return 2;

        if (hash[i] == 2)
            deq++;
        if (deq == 2)
            return 4;


    }
    if (deq == 1)
        return 5;
    if (eq == 3 && hash[2] == hash[3] && hash[3] == hash[4] &&hash[2]==1 ){
        if (a[3] == 14){
            a[3] = 1;
            sort(a, a + 4);
            return 2;
        }
    }
    return 6;
}

int cmp(int *a, int *b, int kind)
{
    if (kind == 3)
    {
        int h1[15], h2[15];
        memset(h1, 0, sizeof(h1));
        memset(h2, 0, sizeof(h2));
        int c1, c2;
        for (int i = 0; i<4; i++)
        {
            h1[a[i]]++;
            if (h1[a[i]] == 3)
                c1 = a[i];
        }
        for (int i = 0; i<4; i++)
        {
            h2[b[i]]++;
            if (h2[a[i]] == 3)
                c2 = a[i];
        }
        if (c1>c2)
            return 1;
        if (c1<c2)
            return -1;

    }
    if (kind == 4)
    {
        int h1[15], h2[15];
        memset(h1, 0, sizeof(h1));
        memset(h2, 0, sizeof(h2));
        int c1, c2;
        for (int i = 0; i<4; i++)
        {
            h1[a[i]]++;
            if (h1[a[i]] == 2)
                c1 = a[i];
        }
        for (int i = 0; i<4; i++)
        {
            h2[b[i]]++;
            if (h2[a[i]] == 2)
                c2 = a[i];
        }
        if (c1>c2)
            return 1;
        if (c1<c2)
            return -1;
    }
    for (int i = 3; i >=0; i--)
    {
        if (a[i] > b[i])
            return 1;
        else if (a[i] < b[i])
            return -1;
    }
    return 0;
}

int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */
    string a, b;
    int aa[4], bb[4];
    int hash[15];
    while (cin >> a >> b)
    {
        int ans = 0;
        int idx = 0;
        for (int i = 0; i < a.size(); i++)
        {
            int sum = 0;
            if (a[i] >= '2'&&a[i] <= '9')
            {
                sum = a[i] - '0';
                aa[idx++] = sum;
            }
            else if (a[i] == '1')
            {
                sum = 10;
                aa[idx++] = sum;
                i++;
            }
            else if (a[i] == ',')
            {
                continue;
            }
            else{
                sum = change(a[i]);
                aa[idx++] = sum;
            }

        }
        idx = 0;
        for (int i = 0; i < b.size(); i++)
        {
            int sum = 0;
            if (b[i] >= '2'&&b[i] <= '9')
            {
                sum = b[i] - '0';
                bb[idx++] = sum;
            }
            else if (b[i] == '1')
            {
                sum = 10;
                bb[idx++] = sum;
                i++;
            }
            else if (b[i] == ',')
            {
                continue;
            }
            else{
                sum = change(b[i]);
                bb[idx++] = sum;
            }
        }

        memset(hash, 0, sizeof(hash));
        for (int i = 0; i < 4; i++)
        {

            hash[aa[i]]++;
            hash[bb[i]]++;
            if (hash[aa[i]] > 4 || hash[bb[i]] > 4)
            {
                ans = -2;
                break;
            }

        }
        if (ans == -2)
        {
            cout << ans << endl;
            continue;
        }
        std::sort(aa, aa + 4);
        std::sort(bb, bb + 4);


        int ka = istype(aa);
        int kb = istype(bb);

        //for (int i = 0; i < 4; i++)
        //    cout << aa[i] << " ";
        //cout << endl;
        //for (int i = 0; i < 4; i++)
        //    cout << bb[i] << " ";
        //cout << endl;

        //cout << ka << " " << kb << endl;
        if (ka == kb)
        {
            ans = cmp(aa, bb,ka);
        }
        else{
            if (ka < kb)
                ans = 1;
            else
                ans = -1;
        }
        cout << ans << endl;
    }
    return 0;
}

 

 

(二三題待續)--

題目二:

題意很簡單,找出所給數字的下一個迴文數。所給數字不必定是迴文數,要找的是剛好大於這個數字的最小的迴文數。

代碼以下:

/*
* Complete the function below.
*/
#include<iostream>
#include<fstream>
#include<string>

using namespace std;

string getNextSymmetricNumber(string n) {
    int len = n.length();
    int i = 0;

    int dm = len / 2;

    dm += len % 2;

    int * num = new int[len + 1];

    for (int i = 1; i <= len; i++){
        num[i] = n[i - 1] - '0';
    }
    int dntkn = 0;
    int dntkn1 = 1;
    for (int i = dm; i >= 1; i--){
        int l = i;
        int r = len - i + 1;
        if (num[l]<num[r])
        {
            dntkn1 = 0;
            num[dm]++;
            num[len - dm + 1] = num[dm];
            for (int i = dm; i >= 1; i--){
                if (num[i] == 0){
                    if (i >= 2){
                        num[i - 1]++;
                        num[len - i + 2] = num[i - 1];
                    }
                    else{
                        dntkn = 1;
                        break;
                    }
                }
                else
                    break;
            }

            if (dntkn == 1)
                break;
            i = dm + 1;

            for (int k = dm + 1; k <= len; k++){
                num[k] = 0;
            }
        }
        else if (num[l]>num[r]){
            dntkn1 = 0;
            num[r] = num[l];
            for (int i = l; i >= 1; i--){
                num[len - i + 1] = num[i];
            }
            break;
        }
    }

    if (dntkn1 == 1){
        num[dm] = (num[dm] + 1) % 10;
        num[len - dm + 1] = num[dm];
        for (int i = dm; i >= 1; i--){
            if (num[i] == 0){
                if (i >= 2){
                    num[i - 1] = (num[i - 1] + 1) % 10;
                    num[len - i + 2] = num[i - 1];
                }
                else{
                    dntkn = 1;
                    break;
                }
            }
            else
                break;
        }
    }
    string out = "";
    if (dntkn == 1)
        out += "1";
    for (int i = 1; i <= len; i++){
        if (dntkn == 1 && i == len)
            break;
        out += ('0' + num[i]);
    }
    if (dntkn == 1)
        out += "1";
    return out;
}
int main() {
    ofstream fout(getenv("OUTPUT_PATH"));
    string res;
    string _n;
    getline(cin, _n);

    res = getNextSymmetricNumber(_n);
    fout << res << endl;

    fout.close();
    return 0;
}

 

題目三:

題意也很簡單,給定兩個節點,在一個無盡的徹底三叉樹中,找到其最小公共父節點號。

這個題目沒有來得及作。找公共父節點倒不是什麼新鮮事,可是這裏有個小trick,給定的只是節點編號,返回的也是節點編號。而節點編號的規律是按層次,蛇形編號。

根節點是0,第一層從左到右是1~3,第二層從左到右就變成了12~4(由於總體是蛇形排列),第三層從左到右13~40  。。。

歡迎探討

相關文章
相關標籤/搜索