亞馬遜的在線筆試也是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 。。。
歡迎探討