网易雷火的一个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  }
View Code

 

posted @ 2022-04-24 14:05  Huankong  阅读(59)  评论(0)    收藏  举报