美团8.6笔试思路-后端岗

  1. 礼盒包装

    给定a、b两种点心的数量,每个礼盒放3个点心,a、b至少各有一个,求最多能包多少个礼盒

  • 设2a1b礼盒有x个,2b1a礼盒有y个,线性规划问题:
    max (x+y) s.t. (2x+y ≤ a) && (x+2y ≤ b) && (x ≥ 0) && (y ≥ 0)
  • 根据 a b 关系,z = x+y = a或b或(a+b)/3
  1. 分割点k实验

    给定一组0,-1,+1数组,分割点k左大于等于0、右侧小于等于0的为异常数据,求最乐观情况下有多少个异常数据

  • 记录正数和负数的总数量pos neg
  • 遍历数组,记录当前位置左侧的负数数量curneg,更新ans = min(ans, curneg + (pos - curpos))
  1. 反转魔法石

    给定一组魔法石正面和反面表示的数字,只有当至少一半相同数字的面朝上可以触发法阵,初始状态为全部朝上,求最少需要翻转多少块石头可以触发法阵,无解输出-1

  • 根据初始状态朝上数字出现次数从大到小尝试翻转,如果可以触发则输出次数
  • 如果初始正面数字无法触发,则输出反面数字出现次数超过(n+1)/2的最小次数,如果没有则输出-1

至过了91%,可能哪里没有考虑全。测试用例比较弱,只考虑初始正面有超过一半的数字就输出0,否则输出-1就能过73%。

  1. 数据拆分

    给定n个样本的类别编号,输入的次序为样本编号,每类样本编号最小的(m+1)/2为训练集,剩下的为测试集。按照样本编号升序输出所有训练集样本及训练集样本

  • vector<vector<int> > ybz(k+1); //样本组:ybz[i]保存样本类别i的所有样本</int>
  • 根据ybz[i].size()拆分训练集和测试集
  • 对总测试集和总训练集排序,然后输出即可
  1. 字符串第k位

    将字符串s丢入机器后则输出新字符串s+reverse(s)+"wow"。初始字符串为"MeiTuan",不停的反复将新字符串丢入机器,求得到的无限长字符串的第k位字母(1 ≤ k ≤ 1e18)

  • 用long long数组保存每次丢入机器得到是字符串长度,分别为7 17 37 ...

  • 根据k的大小,找到k所属字符串是第几次丢入机器得到的字符串

  • 根据k与当前字符串长度的关系,判断该字母是上一字符串的第几个字母,直到k ≤ 7,输出字母即可

    #include<iostream>
    #include<vector>
    #include<string>
    using namespace std;
    int main() {
      int T;
      cin >> T;
    
      string bases("MeiTuan");
      string wows("wow");
      vector<long long> lens = {7};
    
      while(true){
          if(lens.back() > 1e18)
              break;
          auto thislen = lens.back() * 2 + 3;
          lens.push_back(thislen);
      }   
    
      while(T--) {
          long long k;
          cin >> k;
    
          int idx;
          for(idx = 0; idx<lens.size(); ++idx) {
              if(k <= lens[idx])
                  continue;
          }
          idx -= 1;
    
          while(k > 7) {
              auto curlen = lens[idx];
    
              // 属于“wow”部分
              if(k > lens[idx-1] * 2) {
                  cout << wows[k-lens[idx-1]*2-1] << endl;
                  break;       
              }
    
              // 属于上一字符串逆序部分
              if(k > lens[idx-1]){
                  k = lens[idx-1] * 2 - k + 1;
              }
              // 遍历上一字符串
              idx--;
          }
    
          // 已经输出过了
          if(k > 7)
              continue;
          // 输出“MeiTuan”的第k位字母
          cout << bases[k-1] << endl;
      }
      return 0;
    }
#美团笔试#
全部评论
感谢分享,估计最近就能用到了
点赞 回复 分享
发布于 2022-08-07 22:56

相关推荐

06-27 15:15
长安大学 Java
哈哈哈,你是老六:这种就是培训机构骗钱的
点赞 评论 收藏
分享
06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
评论
7
22
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务