2020.09.05 搜狗研发岗笔试 A~C题解

A. 三种商品,两个可以换一个任意的,三种各一个可以换一个奖品,问最多换几个奖品。
直接二分答案。
class Solution {
public:
  int numberofprize(int a, int b, int c) {
    int lo = 0, hi = 1E9;
    int ret = 0;

    auto check = [&](int val) {
      int tmp = 0;
      int x = a, y = b, z = c;
      x -= val, y -= val, z -= val;
      if (x >= 0) tmp += x, x = 0;
      if (y >= 0) tmp += y, y = 0;
      if (z >= 0) tmp += z, z = 0;
      return tmp / 2 >= -(x + y + z);
    };

    while (lo <= hi) {
      int mid = (lo + hi) >> 1;
      if (check(mid)) {
        ret = mid;
        lo = mid + 1;
      } else {
        hi = mid - 1;
      }
    }
    return ret;
  }
};

B. 盖房子什么的。
直接模拟。
class Solution {
public:
  int getHouses(int t, int* xa, int xaLen) {
    int ret = 2;
    vector<int> x, a;
    for (int i = 0; i < xaLen; i += 2) {
      x.emplace_back(xa[i]);
      a.emplace_back(xa[i + 1]);
    }
    int n = x.size();
    if (n == 1) return 2;
    for (int i = 0; i < n - 1; i++) {
      double lo = (double)x[i] + (double)a[i] / 2.0;
      double hi = (double)x[i + 1] - (double)a[i + 1] / 2.0;
      if (hi - lo < t) continue;
      if (hi - lo == t) {
        ret++;
      } else {
        ret += 2;
      }
    }
    return ret;
  }
};

C. 构造密码什么的。
记搜,f(i,len)维护当前数字为i,目前匹配到长度为len时的方案数。用一个标记去判重。
using LL = long long;

class Solution {
public:
  long long getPasswordCount(string password) {
    int n = password.length();
    LL f[11][55];
    memset(f, -1, sizeof f);
    function<LL(int, int, int flag)> dfs = [&](int i, int len, int flag) {
      if (~f[i][len]) return f[i][len];
      if (len == n) return 1LL - flag;
      LL ret = 0;
      double tmp = password[len] - '0' + i;
      tmp =  (double)(tmp) / 2.0;
      if (tmp != (int)tmp) {
        tmp++;
        ret += dfs((int)tmp, len + 1, flag && ((int)tmp == password[len] - '0'));
      }
      tmp = (password[len] - '0' + i) / 2.0;
      ret += dfs((int)tmp, len + 1, flag && ((int)tmp == password[len] - '0'));
      return f[i][len] = ret;
    };
    LL ret = 0;
    if (n == 1) return 9;
    for (int i = 0; i <= 9; i++) {
      memset(f, -1, sizeof f);
      ret += dfs(i, 1, i == password[0] - '0');
    }
    return ret;
  }
};


#笔试题目##搜狗#
全部评论
第二题,原因找到了,double。
2 回复 分享
发布于 2020-09-05 20:12
第二题一样的做法 为啥一直过40% 难道是没有强转double类型吗
2 回复 分享
发布于 2020-09-05 20:10
谷歌大佬
1 回复 分享
发布于 2020-09-05 22:14
为什么我第二题一样就卡了40
1 回复 分享
发布于 2020-09-05 20:10
真强,第三题没有思路
点赞 回复 分享
发布于 2020-09-06 09:53
请问,第三题 flag && ((int)tmp == password[len] - '0'),这句怎么理解?感谢
点赞 回复 分享
发布于 2020-09-05 21:03
**!刚才细细的品了一下,真的是大佬!
点赞 回复 分享
发布于 2020-09-05 20:44
太强了!
点赞 回复 分享
发布于 2020-09-05 20:37
第一题能讲讲思路吗
点赞 回复 分享
发布于 2020-09-05 20:17
function numberofprize( a,b,c ) {   // write code here   let arr = [a,b,c]      arr.sort((a,b) => a-b)   if(arr[2] > arr[1]){     if(arr[2] - 2 <= arr[0] ){       return arr[0]     }   }   if(arr[2] == arr[1]){     if(arr[2] - 1 <= arr[0]){       return arr[0]     }   }         if(arr[2] == arr[1] && arr[1] == arr[0]){       return arr[0]   }   else if(arr[2] === arr[1]){       arr[2] = arr[2] - 1       arr[1] = arr[1] - 1       arr[0] = arr[0] + 1   }   else{       if(arr[2] - 2 > arr[0]){           arr[2] = arr[2] - 2           arr[0] = arr[0] + 1       }   }      return numberofprize(arr[0],arr[1],arr[2]) } 这样为什么就0了,也没有显示超时,测试了几个也对
点赞 回复 分享
发布于 2020-09-05 20:17
tql
点赞 回复 分享
发布于 2020-09-05 20:16
太强了大佬
点赞 回复 分享
发布于 2020-09-05 20:14
为什么我是什么 两个数组,求两部分的方差和最小啊
点赞 回复 分享
发布于 2020-09-05 20:11
tql
点赞 回复 分享
发布于 2020-09-05 20:11
tql
点赞 回复 分享
发布于 2020-09-05 20:08
tql
点赞 回复 分享
发布于 2020-09-05 20:06
tql
点赞 回复 分享
发布于 2020-09-05 20:06

相关推荐

野猪不是猪🐗:现在的环境就是这样,供远大于求。 以前卡学历,现在最高学历不够卡了,还要卡第一学历。 还是不够筛,于是还要求得有实习、不能有gap等等... 可能这个岗位总共就一个hc,筛到最后还是有十几个人满足这些要求。他们都非常优秀,各方面都很棒。 那没办法了,看那个顺眼选哪个呗。 很残酷,也很现实
点赞 评论 收藏
分享
小厂面经,也是我的处女面(30min)1.自我介绍2.spring&nbsp;boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring&nbsp;task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
评论
10
38
分享

创作者周榜

更多
牛客网
牛客企业服务