20200905秋招搜狗C++后台笔试题(3t 90min)
第一题:
class Solution { using ll = long long; public: int numberofprize(int a, int b, int c) { ll x = a; ll y = b; ll z = c; ll cnt = 0; if(x < y) swap(x, y); if(x < z) swap(x, z); if(y < z) swap(y, z); cnt += z; x -= z; y -= z; if(y == 0) { return cnt + x / 5; } return cnt + (x + y) / 4; } };
第二题:
class Solution { const double eps = 1e-6; using pdd = pair<double, double>; public: int getHouses(int t, int* xa, int xaLen) { vector<pdd> arr(xaLen / 2); int n = arr.size(); if(n == 0) return 0; if(n == 1) return 2; for(int i = 0, t = 0; i < xaLen; i += 2) { arr[t].first = xa[i] - (xa[i+1] / 2.0); arr[t++].second = xa[i] + (xa[i+1] / 2.0); } set<double> pos; pos.insert(arr[0].first); for(int i = 1; i < n; ++i) { double dx = arr[i].first - arr[i-1].second; if(dx < t) continue; if(dx - t <= eps) { pos.insert(arr[i].first); } else { pos.insert(arr[i-1].second); pos.insert(arr[i].first); } } pos.insert(arr[n-1].second); return pos.size(); } };
第三题:
class Solution { using ll = long long; public: long long getPasswordCount(string password) { set<string> ans; if(password.size() <= 1) return 9; for(int i = 0; i < 10; ++i) { string path = to_string('0' + i); dfs(password, 1, path, ans); } if(ans.count(password)) return ans.size()-1; return ans.size(); } void dfs(string& s, int left, string p, set<string>& ans) { if(left >= s.size()) { ans.insert(p); return; } int val = (p.back() - '0') + (s[left] - '0'); char ch = ('0' + val/2); if(val&0x1) { p.push_back(ch); dfs(s, left+1, p, ans); p.pop_back(); ch++; p.push_back(ch); dfs(s, left+1, p, ans); p.pop_back(); } else { p.push_back(ch); dfs(s, left+1, p, ans); p.pop_back(); } } };