美团25日实习软开笔试

##有出错的地方麻烦各位大佬指教!!!

美团C++转正实习

  • 时间:2023/3/25

  • 完成情况:3/5

  • 时长:2h

  • 自我总结:第一次使用ACM模式,输入输出上不熟悉花了较长时间

  • 五道编程题

    • ==第一道:==验证出入栈顺序有效性,leetcode原题,当时文字太多,没有静下心好好审题直接跳过了,血亏

    • #include<iostream>
      #include<algorithm>
      #include<vector>
      #include<stack>
      
      using namespace std;
      bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
          int s1 = pushed.size();
          stack<int> sta;
          sta.push(pushed[0]);
          int i = 1;
          int j = 0;
          bool res;
          while (!sta.empty()) {
              if (sta.top() != popped[j]) {
                  if (i >= s1) {
                      return  false;
                  }
                  sta.push(pushed[i]);
                  i++;
      
              }
              else {
                  sta.pop();
                  j++;
                  if (sta.empty() && i < s1) {
                      sta.push(pushed[i]);
                      i++;
                  }
              }
          }
          return true;
      
      }
      
      int main() {
          bool res;
          vector<int> pushed;
          vector<int> poped;
          int n;
          cin >> n;
          int num1;
          while (n > 0 && cin >> num1) {
              pushed.push_back(num1);
              n--;
          }
          int m;
          cin >> m;
          while (m > 0 && cin >> num1) {
              poped.push_back(num1);
              m--;
          }
          res = validateStackSequences(pushed, poped);
          cout << res << endl;
      
          return 0;
      }
      
    • ==第二道:== 动态规划,跟leetcode打家劫舍差不多,要求选了a[i],就不能选a[i-1],a[i -2],a[i+1],a[i +2], 给你一个数组代表a[i]的值,求怎么选最大。

    • dp[i]代表数组长度i所能选到的最大值

    • 状态转移方程:dp[i] = max(dp[i-1], dp[i -3] + a[i])

    • #include<iostream>
      #include<algorithm>
      #include<vector>
      #include<stack>
      
      using namespace std;
      
      int choice(vector<int>& a) {
          int len = a.size();
          vector<int> dp(len);
          dp[0] = a[0];
          if (len >= 2) {
              dp[1] = max(a[0], a[1]);
              if (len >= 3) {
                  dp[2] = max( dp[1], a[2]);
              }
          }
          for (int i = 3; i < len; i++) {
              int tmp = dp[i - 3] + a[i];
              dp[i] = max(dp[i - 1], tmp);
          }
          return dp[len - 1];
      }
      
      int main() {
          int res;
          vector<int> a;
          int n;
          cin >> n;
          int num1;
          while (n > 0 && cin >> num1) {
              a.push_back(num1);
              n--;
          }
          res = choice(a);
      
          cout << res << endl;
      
          return 0;
      }
      
    • ==第三道==: 0-1背包问题,n块巧克力板,边长为a[i], 重量为a[i]*a[i], m 个背包, 可以装重量为b[i], 求每个背包最多可以装多少

    • 思路: 可以对巧克力板按重量从小到大排序,前缀和即可

    • #include<iostream>
      #include<algorithm>
      #include<vector>
      #include<stack>
      
      using namespace std;
      
      int large(vector<int>& a, int b) {
          int sum = 0;
          int len = a.size();
          int i;
          for (i = 0; i < len; i++) {
              sum += a[i];
              if (sum > b) {
                  break;
              }
          }
          return i;
      }
      
      int main() {
          int n, m;
          cin >> n >> m;
          vector<int> a, b;
          int ins;
          while (n > 0 && cin >> ins) {
              a.push_back(ins * ins);
              n--;
          }
          while (m > 0 && cin >> ins) {
              b.push_back(ins);
              m--;
          }
          sort(a.begin(), a.end());
          for (int tmp : b) {
              cout << large(a, tmp)<< " ";
          }
          cout << endl;
      
          return 0;
      }
      
    • ==第四道:==字符分割, 如给你一串字符“path=/chat.openai.com, language=c++, path=baidu.com", 输入 2 path language,输出 baidu.com c++

    • 使用unordered_map

    • #include<iostream>
      #include<vector>
      #include<string>
      #include<unordered_map>
      
      using namespace std;
      
      
      int main() {
          string str;
          getline(cin, str);
          unordered_map<string, string> mmap;
          //字符分割
          for (int i = 0; i < str.size(); i++) {
              int start = i;
              while (start < str.size() && str[start] != '=') {
                  start++;
              }
              string str2 = str.substr(i, start - i);
              int start2 = start + 1;
              while (start2 < str.size() && str[start2] != ',') {
                  start2++;
              }
              string str3 = str.substr(start + 1 , start2 - start - 1);
              i = start2;
              //此处说相同的key取后者的value,应该直接替代是没有问题的
              mmap[str2] = str3;
          }
          //输入验证
          int n;
          cin >> n;
          string str4;
          vector<string> vec;
          while (n > 0 && cin >> str4) {
              vec.push_back(str4);
              n--;
          }
          for (string& strTmp : vec) {
              if (mmap.count(strTmp) >= 1) {
                  cout << mmap[strTmp] << endl;
              }
              else {
                  cout << "EMPTY" << endl;
              }
          }
          return 0;
      }
      
    • ==第五道:==给你一个每一天糖果的美味值数组,只能隔天吃,但也可以反悔,有K次反悔机会

    • 思路:先用打家劫舍的方法,然后对对没有选的取k个最大值

    • #include<iostream>
      #include<vector>
      #include<string>
      #include<unordered_map>
      #include<queue>
      
      using namespace std;
      int maxTaste(int k, vector<int>& vec) {
          int len = vec.size();
          vector<int> dp(len);
          dp[0] = vec[0];
          if (len == 1) {
              return dp[0];
          }
          vector<bool> used(len, false);
          if (len >= 2) {
              dp[1] = max(dp[0], vec[1]);
              if (len == 2) {
                  if (k > 0) {
                      return vec[0] + vec[1];
                  }
                  else {
                      return dp[1];
                  }
              }
          }
          for (int i = 2; i < len; i++) {
              dp[i] = max(dp[i - 2] + vec[i], dp[i - 1]);
          }
         //判断最后一个选了没
          bool jus;
          if (dp[len - 3] + vec[len - 1] > dp[len - 2]) {
              jus = true;
          }
          else {
              jus = false;
          }
          priority_queue<int, vector<int>, less<int>> pq;
          if (!jus) {
              for (int i = len - 1; i > 0; i = i - 2) {
                  pq.push(vec[i]);
              }
          }
          else {
              for (int i = len - 2; i > 0; i = i - 2) {
                  pq.push(vec[i]);
              }
          }
          int res = dp[len - 1];
          for (int i = 0; i < k; i++) {
              res += pq.top();
              pq.pop();
          }
          return res;
      
      
      
      }
      
      int main() {
          //反悔次数
          int k;
          cin >> k;
          //输入美味值
          int n;  //天数
          cin >> n;
          vector<int> vec;
          int  num;
          while (n > 0 && cin >> num) {
              vec.push_back(num);
              n--;
          }
          cout << maxTaste(k, vec) << endl;
          return 0;
      }
      
#美团笔试#
全部评论
美团转正是必须参加笔试吗?
1 回复 分享
发布于 2023-03-27 22:00 辽宁
突出一个:打家劫舍
点赞 回复 分享
发布于 2023-03-27 17:03 广东
背包那个 用前缀和或者直接累加,容易越界吧我记得(
点赞 回复 分享
发布于 2023-03-28 09:44 陕西

相关推荐

牛客618272644号:佬携程工作怎么样,强度大吗
点赞 评论 收藏
分享
10 32 评论
分享
牛客网
牛客企业服务