20210313美团笔试总结

总结:

  1. 听同学说,只要提交了有AC百分之多少,就会有相应的分数,下次一定要及时提交,然后再优化使其达到AC100%;
  2. 对于输入输出的操作还不太熟悉,这也难怪,之前都是使用LeetCode,突然转换到类似牛客的这种方式,不太习惯
  3. 总共5道编程题,其实不用太赶,第一次过于谨慎,过于紧张了

1数组对称输出

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;

int main(){
   
    int m,n;
    cin>>m>>n;
    vector<vector<int>> nums(m,vector<int>(n));
    for(int i=0;i<m;++i)
        for(int j=0;j<n;++j)
            cin>>nums[i][j];//对于cin,会跳过换行、回车、Tab,也用换行、回车、Tab来区分输入
    for(int i=0;i<m;++i){
   
        for(int j=0;j<n;++j)
            cout<<nums[i][j]<<" ";
        cout<<endl;
    }
    return 0;
}

2打印字符串中的数字,并排序

发现stoi会自动将前导0去掉;AC49%,可能是大数问题,没有考虑long的情况;

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;

int main(){
   
    string str;
    cin>>str;
    vector<int> nums;
    string tmpnum;
    for(auto i=0;i<str.length();++i){
   
        while(str[i]>='0'&&str[i]<='9'){
   
            tmpnum+=str[i];
            i++;
        }
        while(!tmpnum.empty()){
   
            if(tmpnum[0]=='0')
                tmpnum.erase(0,1);
            else
            {
   
                break;
            }    
        }
        if(!tmpnum.empty()) nums.push_back(stoi(tmpnum));
        tmpnum.clear();
    }
    sort(nums.begin(),nums.end());
    for(auto i:nums)
        cout<<i<<endl;
    return 0;
}

3数组里连续k个数,ai、ai+1、…ai+k-1,的众数

暴力方法:每次将k个数传到一个新的数组里面,然后利用sort排序从大到小,这样找出的众数一定是最小的,(这里可以利用sort从大到小排序,而不是sort然后reverse),找众数的过程可以采用摩尔投票;

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;

//找出数组里面连续k个数的众数,如果存在多个众数,输出最小的那个

//暴力方法:每次将k个数传入一个新的数组里面,sort然后reverse,然后摩尔投票得出众数;
//如果直接使用摩尔排序的话,最后得到的众数可以不是最小的
bool MyFunction(int& a,int& b){
   
    return a>b;
}

int ReturnMode(vector<int>& nums,int begin,int k){
   
    vector<int> NUMS;
    for(int i=begin;i<begin+k;++i)
        NUMS.push_back(nums[i]);
    sort(NUMS.begin(),NUMS.end(),MyFunction);
    //摩尔投票
    int Candidate=NUMS[0],count=0;
    for(int tmp:NUMS){
   
        if(Candidate==tmp){
   
            count++;
            continue;
        }
        if(count==0){
   
            Candidate=tmp;
            count++;
            continue;
        }
        count--;
    }
    return Candidate;
}

int main(){
   
    int n,k;
    cin>>n>>k;
    vector<int > nums(n);
    for(int i=0;i<n;++i)
        cin>>nums[i];
    for(int j=0;j<n-k+1;++j)
        cout<<ReturnMode(nums,j,k)<<endl;
    return 0;
}

摩尔思路来自LeetCode169、LeetCode229:


如果需要找出数组里面多个众数,例如:
想要找出两个众数,那么每个众数需要出现n/(2+1)次
想要找出k个众数,那么每个众数需要出现n/(k+1)次

具体实现的时候,定义两个待选candidate1、candidate2,以及选票数count1、count2;
   分为两个阶段:投票阶段、计数阶段;
   为什么投完票还要重新计数?
   因为可能选出了两个数,其中一个不满足出现n/3次,
例如 1,2,1,1,1,3 ;摩尔投票选出了1和3,但是3只出现了1次,不满足,因此满足条件的众数是1;

class Solution {
   
public:
    vector<int> majorityElement(vector<int>& nums) {
   
        //摩尔投票:分为投票阶段和计数阶段
        //想要找出两个众数,那么每个众数需要出现n/(2+1)次
        //想要找出k个众数,那么每个众数需要出现n/(k+1)次

        vector<int> Ans;
        //投票阶段
        int cand1=nums[0],cand2=nums[0],count1=0,count2=0;
        for(auto tmpNum:nums){
   
            if(cand1==tmpNum){
   
                count1++;
                continue;
            }
            if(cand2==tmpNum){
   
                count2++;
                continue;
            }
            if(count1==0)
            {
   
                cand1=tmpNum;
                count1++;
                continue;
            }
            if(count2==0)
            {
   
                cand2=tmpNum;
                count2++;
                continue;
            }
            count1--;
            count2--;
        }
        //计数阶段
        count1=0,count2=0;
        for(auto tmpNum:nums){
   
            if(cand1==tmpNum){
   
                count1++;
                continue;
            }
            if(cand2==tmpNum){
   
                count2++;
            }
        }
        if(count1>nums.size()/3) Ans.push_back(cand1);
        if(count2>nums.size()/3) Ans.push_back(cand2);
        return Ans;
    }
};

4待续

5待续

刷题总结类 文章被收录于专栏

这里记录一些刷题时候的总结思考

全部评论
可以用Python做题嘛
点赞 回复 分享
发布于 2021-09-02 23:29

相关推荐

不愿透露姓名的神秘牛友
昨天 12:31
以前小时候我最痛恨出轨、偷情的人,无论男女,为什么会出轨?现在我成了自己最讨厌的人,没想到分享的东西在牛客会被这么多人看,大家的评价都很中肯,我也认同,想过一一回复,但我还是收声了,我想我应该说说这件事,这件事一直压在我心里,是个很大的心结,上面说了人为什么出轨,我大概能明白了。我们大一下半年开始恋爱,开始恋爱,我给出了我铭记3年的承诺,我对她好一辈子,我永远不会背叛,我责任心太重,我觉得跟了我,我就要照顾她一辈子,我们在一起3年我都没有碰过她,她说往东我就往东,她说什么我做什么,她要我干什么,我就干什么!在学校很美好,中途也出过一些小插曲,比如男闺蜜、男闺蜜2号等等等。但我都强迫她改掉了,我...
牛客刘北:两个缺爱的人是没有办法好好在一起的,但世界上哪有什么是非对错?你后悔你们在一起了,但是刚刚在一起的美好也是真的呀,因为其他人的出现,你开始想要了最开始的自己,你的确对不起自己,21岁的你望高物远,你完全可以不谈恋爱,去过你想要的生活,你向往自由,在一起之后,你要想的不是一个人,而是两个人,你不是变心了,就像你说的,你受够了,你不想包容了,冷静几天是你最优的选择,爱人先爱己。
社会教会你的第一课
点赞 评论 收藏
分享
点赞 评论 收藏
分享
这算盘打的
程序员小白条:都这样的,都是潜规则,你自己说可以实习一年就行了,实习可以随便跑路的
点赞 评论 收藏
分享
评论
1
13
分享

创作者周榜

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