网易雷火的一个RPC协议笔试题,当时没做出来,现在放到博客上
测例如下:
0 Login ssi
1 MoveTo iii
01FFFFFFFF0000000100000A000003050A0B0C1A2B3C4F5D01000000
输入的字符串可能有多个,但是但代码中值写了输入一条的情况,若参考此代码,需要重新考虑多条字符串的情况。
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <math.h> 5 #include <string> 6 #include <sstream> 7 using namespace std; 8 9 vector<string> rpct; 10 11 int zhilings(int num, int N, vector<vector<string>>& rpc){ 12 int total = 0; 13 for (int i = 0; i < N; i++) 14 { 15 16 int beishu = 1; 17 for (int j = 0; j < rpc[i][0].size(); j++) 18 { 19 total *= beishu; 20 total += (rpc[i][0][j] - '0'); 21 beishu *= 10; 22 } 23 if (total == num){ 24 total = i; 25 break; 26 } 27 } 28 return total; 29 } 30 31 int xx16xx(string str1){ 32 long long sum = 0; 33 for (int i = 0; i<8; ++i) 34 { 35 if (str1[i] >= 'A' && str1[i] <= 'F') 36 sum = sum * 16 + str1[i] - 'A' + 10; 37 else if (str1[i] >= 'a' && str1[i] <= 'f') 38 sum = sum * 16 + str1[i] - 'a' + 10; 39 else if (str1[i] >= '0' && str1[i] <= '9') 40 sum = sum * 16 + str1[i] - '0'; 41 } 42 return sum; 43 } 44 45 int main(){ 46 47 int N; 48 cin >> N; 49 string str; 50 vector<vector<string>> rpc(N, vector<string>(3)); 51 52 for (int i = 0; i < N; i++) 53 { 54 for (int j = 0; j < 3; j++) 55 { 56 cin >> rpc[i][j]; 57 } 58 } 59 60 cin >> str; //只输入了一条字符串 61 //getline(cin,str); 62 63 int num = 0; 64 int weishu = -1; 65 66 int zhiling = 0; 67 68 for (int i = 0; i < N; i++) 69 { 70 int flag = 0; 71 vector<int> aa; 72 73 num = (str[weishu + 1] - '0') * 16 + (str[weishu + 2] - '0') * 1;//算出第n个RPC指令id 74 weishu += 2; 75 zhiling = zhilings(num, N, rpc); //第n个指令与输入函数组的对应关系 76 77 rpct.push_back(rpc[num][1]); 78 rpct.push_back("("); 79 80 for (int j = 0; j < rpc[zhiling][2].size(); j++) 81 { 82 if (rpc[zhiling][2][j] == 's'){ 83 flag = 1; 84 int tt = (str[weishu + 1] - '0') * 16 + (str[weishu+2] - '0') * 1; 85 weishu += 2; 86 aa.push_back(tt); 87 } 88 else 89 { 90 91 for (int k = 0; k < aa.size(); k++) 92 { 93 rpct.push_back("\""); 94 string sub = str.substr(weishu + 1, aa[k]*2); 95 rpct.push_back(sub); 96 rpct.push_back("\","); 97 weishu += aa[k] * 2; 98 } 99 100 } 101 if (rpc[zhiling][2][j] == 'i'){ 102 string sub = str.substr(weishu + 1, 8); 103 long long sum = xx16xx(sub); 104 stringstream ssre; 105 ssre << sum; 106 rpct.push_back(ssre.str()); 107 rpct.push_back(","); 108 weishu += 8; 109 } 110 } 111 112 if (rpct[rpct.size() - 1] == ","){ 113 rpct[rpct.size() - 1] = ")"; 114 } 115 116 } 117 for (int i = 0; i < rpct.size(); ++i) 118 { 119 cout << rpct[i]; 120 if (rpct[i] == ")"){ 121 cout << endl; 122 } 123 } 124 system("pause"); 125 }

浙公网安备 33010602011771号