华为笔试 5.13 C++ 附代码

第一题:
给一个日期,并告诉你是周几;
然后再给你一个日期,请你判断这是周几。
AC,难点主要在闰年的判断,一开始我没有考虑世纪闰年的情况。还有一点是,用例可能给出的日期是 第一个日期在第二个日期之后,这种情况也得考虑。还有就是这种输入格式,之前接触的少,不太习惯。

#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>
#include <limits>
#include <string>
#include <queue>
#include <unordered_map>
#include <iomanip> 
using namespace std;

// 判断闰年
bool runnian(int y){
    if(y%100==0 && y%400 == 0) return true; 
    if(y%4 == 0 && y%100 != 0) return true;
    return false;
}

int main(){
    // 输入格式:1980 01 02 5 | 1980 01 04
    // 题目:1980 01 02 周五,求1980 01 04周几
    vector<int> fir(3); //存储第一个日期
    vector<int> sec(3); //存储第二个日期
    char temp;
    int wd; //存储第一个日期是周几
    for(int i=0;i<3;i++){
        cin>>fir[i];
    }
    cin>>wd;
    cin>>temp;
    for(int i=0;i<3;i++){
        cin>>sec[i];
    }

    // 处理fir日期在sec之后的情况,swap(fir,sec)
    bool swapflag = false;
    if(fir[0]>sec[0]) swapflag = true;
    if(fir[0] == sec[0] && fir[1]>sec[1]) swapflag = true;
    if(fir[0] == sec[0] && fir[1]==sec[1] && fir[2]>sec[2]) swapflag = true;
    vector<int> tmpvec;
    if(swapflag){
        tmpvec= fir;
        fir = sec;
        sec = tmpvec;
    }

    // 初始化每个月的天数
    vector<int> monthdays={0,31,28,31,30,31,30,31,31,30,31,30,31};

    int days = 0;// 两个日期相差天数

    // 先处理不属于fir和sec的年份天数
    for(int i=fir[0]+1;i<sec[0];i++){
        days += runnian(i)?366:365;
    }

    // 判断闰年
    bool firflag = runnian(fir[0]);
    bool secflag = runnian(sec[0]);

    // fir和sec在同一年
    if(fir[0]==sec[0]){
        if(fir[1]==sec[1]){//fir和sec在同一个月
            days += sec[2]-fir[2];
        }
        else{
            days += monthdays[fir[1]] - fir[2];
            for(int i=fir[1]+1;i<sec[1];i++){
                days += monthdays[i];
            }
            days += sec[2];
            if(firflag && fir[1]<=2 && sec[1]>2) days+=1; //处理闰年
        }
    }
    // fir和sec不在同一年
    else{
        days += monthdays[fir[1]] - fir[2];
        for(int i=fir[1]+1;i<=12;i++){
            days+=monthdays[i];
        }
        for(int i=1;i<sec[1];i++){
            days+=monthdays[i];
        }
        days += sec[2];
        if(firflag && fir[1]<=2) days+=1;//处理闰年
        if(secflag && sec[1]>2) days+=1;
    }

    // 知道了相差天数,求周几
    int ans = 0;
    if(swapflag) ans = (wd-(days%7)+7)%7; //fir日期在sec之后
    else ans = ((days%7)+wd)%7;  //fir日期在sec之前
    if(ans==0) ans=7;
    cout<<ans<<endl;

    return 0;
}
#华为2020春招##华为##笔试题目#
全部评论
求第三题的解法😂
2 回复
分享
发布于 2020-05-14 10:09
楼主  21行是不是 vector<int> fir(3);
点赞 回复
分享
发布于 2020-05-13 22:24
联易融
校招火热招聘中
官网直投
如果给2020 05 11 1 / 2020 05 10那么按照你的算法,days=1,你的ans也不是7呀
点赞 回复
分享
发布于 2020-05-14 01:05
我是90.91不知道哪错了
点赞 回复
分享
发布于 2020-05-14 01:07
楼主笔试通知是5.13日19:00-5.14日21:10吗
点赞 回复
分享
发布于 2020-05-14 14:27
第一题55%,第二题100%,第三题60%,不知道这个成绩如何
点赞 回复
分享
发布于 2020-05-14 22:20
大家有收到消息吗? 还有各位写c++用的什么ide? vs还是vim
点赞 回复
分享
发布于 2020-05-19 09:57

相关推荐

点赞 评论 收藏
转发
6 26 评论
分享
牛客网
牛客企业服务