快手 笔试四道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的值,对差进行排序,差大的排在前面
#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;
    }
};



#快手笔试##笔试题目#
全部评论
想问一下大佬收到面试邀约了吗
1 回复 分享
发布于 2020-04-13 15:25
想知道楼主状态是啥?我100,100,60,100,刚查状态被拒了,太伤心了
点赞 回复 分享
发布于 2020-04-15 00:05
楼主收到快手offer了吗
点赞 回复 分享
发布于 2020-04-26 14:53

相关推荐

ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
牛客410815733号:这是什么电影查看图片
点赞 评论 收藏
分享
6 9 评论
分享
牛客网
牛客企业服务