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;
  }
};


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

相关推荐

牛客771574427号:恭喜你,华杰
点赞 评论 收藏
分享
10 38 评论
分享
牛客网
牛客企业服务