快手 笔试四道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
楼主收到快手offer了吗
点赞 回复 分享
发布于 2020-04-26 14:53
想知道楼主状态是啥?我100,100,60,100,刚查状态被拒了,太伤心了
点赞 回复 分享
发布于 2020-04-15 00:05

相关推荐

bg双非本科,方向是嵌入式。这次秋招一共拿到了&nbsp;8&nbsp;个&nbsp;offer,最高年包&nbsp;40w,中间也有一段在海康的实习经历,还有几次国家级竞赛。写这篇不是想证明什么,只是想把自己走过的这条路,尽量讲清楚一点,给同样背景的人一个参考。一、我一开始也很迷茫刚决定走嵌入式的时候,其实并没有一个特别清晰的规划。网上的信息很零散,有人说一定要懂底层,有人说项目更重要,也有人建议直接转方向。很多时候都是在怀疑:1.自己这种背景到底有没有机会2.现在学的东西到底有没有用3.是不是已经开始晚了这些问题,我当时一个都没答案。二、现在回头看,我主要做对了这几件事第一,方向尽早确定,但不把自己锁死。我比较早就确定了嵌入式这个大方向,但具体做哪一块,是在项目、竞赛和实习中慢慢调整的,而不是一开始就给自己下结论。第二,用项目和竞赛去“证明能力”,而不是堆技术名词。我不会刻意追求学得多全面,而是确保自己参与的每个项目,都能讲清楚:我负责了什么、遇到了什么问题、最后是怎么解决的。第三,尽早接触真实的工程环境。在海康实习的那段时间,对我触动挺大的。我开始意识到,企业更看重的是代码结构、逻辑清晰度,以及你能不能把事情说清楚,而不只是会不会某个知识点。第四,把秋招当成一个需要长期迭代的过程。简历不是一次写完的,面试表现也不是一次就到位的。我会在每次面试后复盘哪些问题没答好,再针对性补。三、我踩过的一些坑现在看也挺典型的:1.一开始在底层细节上纠结太久,投入产出比不高2.做过项目,但前期不会总结,导致面试表达吃亏3.早期有点害怕面试,准备不充分就去投这些弯路走过之后,才慢慢找到节奏。四、给和我背景相似的人一点建议如果你也是双非,准备走嵌入式,我觉得有几件事挺重要的:1.不用等“准备得差不多了”再投2.项目一定要能讲清楚,而不是做完就算3.不要只盯着技术,多关注表达和逻辑很多时候,差的不是能力,而是呈现方式。五、写在最后这篇总结不是标准答案,只是我个人的一次复盘。后面我会陆续把自己在嵌入式学习、竞赛、实习和秋招中的一些真实经验拆开来讲,希望能对后来的人有点帮助。如果你正好也在这条路上,希望你能少走一点弯路。
x_y_z1:蹲个后续
点赞 评论 收藏
分享
评论
6
9
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务