快手 笔试四道AC c++
第一次将所有编程题全部AC,还提前交卷,以为自己水平提高了,,原来是题目简单了😌
第一题:
判断输入的表达式中配对的括号数量,左括号的数量,右括号的数量
#include<iostream> #include<string> #include <stack> using namespace std; int main(){ string myString; getline(cin,myString); int a=0,left=0,right=0; // 表示对数,落单左括号,落单右括号 stack<char> myChar; for(int i=0;i<myString.size();i++){ if(myString[i] == '(' || myString[i] == ')'){ if(myString[i] == ')'){ if(!myChar.empty()){ if(myChar.top() == '('){ a++; myChar.pop(); } else right++; } else{ right++; } } else{ myChar.push(myString[i]); } } } left = myChar.size(); cout<<a<<' '<<left<<' '<<right; return 0; }第二题:
判断一个数是否是完美数幂因子,
解法:模拟除二取余,判断所有余数是否都是1
#include<iostream> #include<string> #include <stack> #include <vector> using namespace std; class Solution { public: /** * 返回无重复幂因子的 N进制完美数之和的所有幂因子 * @param R int整型 * @param N int整型 N进制 * @return int整型vector */ vector<int> GetPowerFactor(int R, int N) { // write code here vector<int> yu; vector<int> result; while(R > 0){ int temp = R % N; yu.push_back(temp); R = R / N; } for(int i=0;i<yu.size();i++){ if(yu[i] == 1) result.push_back(i); else if(yu[i] > 1) return vector<int>(0,0); } return result; } }; int main(){ Solution solution; vector<int> result = solution.GetPowerFactor(39,3); for(auto i:result) cout<<i<<' '; return 0; }第三题:
顾客排队,每一个人有两个属性a和b,每个人的满意度是a*(自己前面的人数)+ b*(后面的人数)
解法:计算每个人的a-b的值,对差进行排序,差大的排在前面
解法:计算每个人的a-b的值,对差进行排序,差大的排在前面
#include<iostream> #include<string> #include <stack> #include <vector> #include <map> using namespace std; class Solution { public: /** * 根据顾客属性计算出顾客排队顺序 * @param a int整型vector 顾客a属性 * @param b int整型vector 顾客b属性 * @return int整型vector */ vector<int> WaitInLine(vector<int>& a, vector<int>& b) { // write code here multimap<int,int,greater<> > diff; for(int i=0;i<a.size();i++){ int temp = a[i]-b[i]; diff.insert(pair<int,int>(temp,i)); } vector<int> result; for(auto i:diff) result.push_back(i.second + 1); return result; } }; int main(){ Solution solution; vector<int> a{8,9,7}; vector<int> b{5,8,3}; vector<int> result; result = solution.WaitInLine(a,b); for(auto i:result) cout<<i<<' '; }第四题:
工位上可以坐的最多人数 [[* , .],[* , .]] 用来表示工位的状态,*表示没有点,每个人前后左右都不可以有人。
解法:从左上角开始,一行一行扫描判断是否可以坐人,没有用DFS的方法。
class Solution { public: /** * 获取最大可同事办公员工数 * @param pos char字符型vector<vector<>> 工位分布 * @return int整型 */ int GetMaxStaffs(vector<vector<char> >& pos) { // write code here int rows = pos.size(); // 行数 int columns = pos[0].size(); // 列数 int count = 0; // 可以坐的人数 //-1表示无电源,0表示有电源无人坐,1表示有人坐 vector<vector<int> > people(rows,vector<int>(columns,-1)); for(int i=0;i<pos.size();i++){ for(int j=0;j<pos[0].size();j++){ if(pos[i][j] == '.') people[i][j] = 0; } } for(int i=0;i<pos.size();i++){ for(int j=0;j<pos[0].size();j++){ if(people[i][j] == 0 && can(people,i,j)){ count++; people[i][j] = 1; // 设置已坐标志 } } } return count; } // 是否可以坐 bool can(const vector<vector<int> >& people,int i,int j){ int rows = people.size(); int columns = people[0].size(); if(i < rows && i >= 0 && j < columns && j >= 0){ if(havePeople(people,i,j-1) || havePeople(people,i,j+1) || havePeople(people,i-1,j) || havePeople(people,i+1,j)){ return false; } return true; } return false; } // 是否有人 bool havePeople(const vector<vector<int> >& people,int i,int j){ int rows = people.size(); int columns = people[0].size(); bool have = false; if(i < rows && i >= 0 && j < columns && j >= 0){ if(people[i][j] == 1) have = true; } return have; } };