Hulu笔试20220916

hulu的笔试难度是今年秋招碰到的最难的,每题都有点麻烦。我第一题看错题意耽误了不少时间,导致第二题没时间写完。第二题一开始也没有想到简单做法。

T1

题意:
输入k个访问记录,每条记录包含一个用户名和一个日期(yyyy-mm-dd,yyyy = 2021),然后输入一个n。求一个最小的时间窗口,使得这个窗口内的活跃用户(在窗口内访问过的用户就是活跃用户)>=n,输出最小的窗口大小。

解法:
先要对日期字符串进行处理,转换成int。然后维护一个滑动窗口计数,用户名用一个哈希表维护一下。
我没注意到在不同天访问的同一个用户只算一次,结果调试了很久,以为不能跳出去所以又一直在写这题,写了大概35分钟,后面的题就寄了。

#include<iostream>
#include<set>
#include<unordered_map>
#include<algorithm>
using namespace std;
int days[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};
int date(const string& t){
  int m = atoi(t.substr(5,2).c_str());
  int d = atoi(t.substr(8,2).c_str());
  int ans = 0;
  for(int i = 0;i<m;++i)
    ans += days[i];
  ans += d-1;
  return ans;

}
pair<int,string> p[1000];
int main(){
  int k;cin>>k;
  string a,b;
  for(int i = 0;i<k;++i){
    cin>>a>>b;
    int t = date(b);
    pair<int,string> pp(t,a);
    p[i] = pp;
  }
  sort(p,p+k);

  int n;
  cin>>n;
  int l = 0, r = 0;
  int cnt = 0;
  unordered_map<string ,int> ma;
  int ans = 366;
  
  while(r<k || cnt >= n){
    if(cnt<n){
      if(ma[p[r].second] == 0) ++cnt;
      ++ma[p[r].second];
      ++r;
    }
    else{
      ans = min(ans,p[r-1].first-p[l].first+1);
      --ma[p[l].second];
      if(ma[p[l].second] == 0) --cnt;
      ++l;
    }
  }

  if (ans == 366) cout<<-1<<endl;
  else cout<<ans<<endl;
}



T2

题意:
输入一个xml格式的字符串,只包含标签和文本,标签没有属性。求标签树的层次遍历。

样例:
input: <root><1><2></2></1><3><6/></3><3/><4></4><5><7/><8><9><10><2/></10></9></8></5></root>
output: root 1 3 3 4 5 2 6 7 8 9 10 2


解法:
对字符串进行分割之后,实际上给的是一个dfs的过程,我一开始想建树再bfs,但其实不用这么麻烦,dfs过程都给你了,就顺序遍历这个dfs过程中间标记一下访问到的结点的深度就可以。比赛时没写完,寄了。

#include<iostream>
#include<set>
#include<string>
#include<vector>
#include<unordered_map>
#include<algorithm>
#include<stack>
using namespace std;
bool debug = 0;
int main(){
    string s;
    if(debug) s = "<root><1><2></2></1><3><6/></3><3/><4></4><5><7/><8><9><10><2/></10></9></8></5></root>";
    else cin>>s;
    int pos  =0;

    int depth = 0;
    vector<pair<int,string>> V;
    while(s.find('<',pos)!=string::npos){
        pos = s.find('<',pos);
        int pos2 = s.find('>',pos);
        string v = s.substr(pos+1,pos2-pos-1);
        pos = pos2+1;

        if (v[0] == '/')  {
            depth --;
            // out
        }
        else if (v[v.length()-1] == '/') {
            V.push_back(pair<int,string>(depth+1, v.substr(0,v.length()-1)) );
            // in and out
        }
        else{
            V.push_back( pair<int,string>(++depth, v) );
            // in
        }
    }
    stable_sort(V.begin(),V.end());
    for(auto p:V){
        cout<<p.second<<" ";
    }
}

T3

菜鸡根本没看到第3题,希望有大佬补充题意



#hulu笔试##hulu##2023秋招##笔试#
全部评论
 * 葫芦娃们平日里经常玩游戏,同时还会交流游戏心得。这一天大家在讨论一款游戏,游戏玩家可以对自己的人物进行技能加点,大家对加点方法产生了争论。已知这款游戏有N个技能序列,每个技能序列都有K个技能,并且对于每个技能序列,  * 必须学习前一个技能之后才能学习后一个技能,并且每个技能都需要花费S[i,j]个技能点才能学习,  * 当剩余技能点不足时这个技能没法学习,自然也没法学这个序列后续的技能。现在我们假设学习完每个技能后对人物有P[i,j]的数据提升。请问当给定T个技能点的情况下,玩家自由选择技能序列以及技能点支配方式,请问人物的数据提升最大是多少?  *第1行:N K T三个整数 (N代表有多少个技能序列, 1 <= N <= 1000, K代表每个技能序列的技能数量,1 <= K <= 100, T代表给定的技能点, 0 <= T <= 100000)  * 第2 .. N+1行: 每行代表第i个技能序列,同时第j个整数S[i,j]代表第i个技能序列的第j个技能需要的技能点S[i,j] (1 <= S[i,j] <= 20)  * 第N+2 .. 2N+1行: 每行代表第i个技能序列,同时第j个整数P[i,j]代表第i个技能序列的第j个技能带来的提升P[i,j] (1 <= P[i,j] <= 10000)  用例:  * 3 3 6  * 1 1 2  * 1 1 3  * 1 1 4  * 10 10 20  * 10 10 30  * 10 10 60  * 输出:80
点赞 回复 分享
发布于 2022-09-18 15:51 上海
一样 只能做两题 就没时间了
1 回复 分享
发布于 2022-09-16 21:19 北京
这两题看着还行啊,
点赞 回复 分享
发布于 2022-09-21 12:42 安徽
哥们 你第一题过了多少呀 我感觉思路还是有点问题
点赞 回复 分享
发布于 2022-09-22 16:33 北京
大佬后续咋样?收到面试通知了吗?
点赞 回复 分享
发布于 2022-09-25 00:47 上海

相关推荐

点赞 评论 收藏
分享
评论
7
13
分享
牛客网
牛客企业服务