荣耀机试20220816

满分600,三道编程,和华子一样。

第一题(100%通过):
日期处理题,输入是xxxx年xx月第xx周的周x,要求转换为xxxx-xx-xx标准格式。从2000-01-01开始,要考虑闰年,要考虑非法输入(比如2018年01月第08周的周1,这种肯定就是不对的)

//
// Created by LJ on 2022/8/16.
//

#include <iostream>
#include <vector>
#include <map>
#include <stdio.h>
using namespace std;

vector<int> monthDays{0,31,28,31,30,31,30,31,31,30,31,30,31};
vector<int> weekdayFromStart{5,6,7,1,2,3,4};

int main(){
    // 处理输入
    int year, month, week, weekday;
    cin >> year >> month >> week >> weekday;
    // 数据处理
    // year:month:01 到2000-01-01过了多少天
    int days = 0;
    days += (year-2000) * 365;
    // 闰年要考虑进去
    for(int y = 2000; y < year; ++y){
        if(y % 4 == 0 && y % 100 != 0){ days++; }
        else if(y % 400 == 0){ days++; }
    }
    // 算月的时间
    for(int m = 1; m < month; ++m){
        days += monthDays[m];
    }
    // 当年如果是闰年,并且月份大于2月,需要多加一天
    if(month > 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)){ days++; }
    // 不考虑第几个周的周几,总的时间已经算好了
    ++days;
//     cout << days << endl; // 打印测试一下
    // days / 7 得到余数,表示到year:month:01是星期几
    int res = days % 7;
//     cout << "res: " << res << endl;
    int dayFromYearMonth01 = weekdayFromStart[res];
//     cout << "周" << dayFromYearMonth01 << endl;
    // 准备输出
    int firstWeekdaysCnt = 7-dayFromYearMonth01+1;
    if(week == 1){
        // 第一个周,需要判断指定的日期,是否在year:month:01之前
        if(weekday < dayFromYearMonth01){ cout << 0 << endl;}
        else{ printf("%04d-%02d-%02d", year, month, weekday-dayFromYearMonth01+1);}
    }
    else{
        int resWeekdaysCnt = (week-2)*7 + firstWeekdaysCnt + weekday;
        // 计算得到的总日期,如果超过了当月的总天数,也是错误的非法数据
        if(resWeekdaysCnt > monthDays[month]){
            // 还要判断是不是闰年
            if(month == 2 && (year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
                if(resWeekdaysCnt == 29){
                    printf("%04d-%02d-%02d", year, month, resWeekdaysCnt);
                }
            }
            else cout << 0 << endl;
        }
        else{
            printf("%04d-%02d-%02d", year, month, resWeekdaysCnt);
        }
    }

    return 0;
}
/**
* 分析题意:
 * 将【某年某月第几个周几】转换为【公历日期】
 *    - 存在非法数据
 *    - 每月的第一周和最后一周一般都不完整
 *    - 还要考虑闰年的影响
 *    - 起始时间为2000-01-01,时间为周六
*/

第二题:买卖物品(100%通过)
简单的离谱。给了两个数组,分别代表商品的***和售卖价,要求最后得到的利润。直接遍历。。。

//
// Created by LJ on 2022/8/16.
//
#include <iostream>
#include <vector>
#include <string>
using namespace std;
void s2vec(const string &s1, vector<int> &m){
    int num = 0;
    for(char ch : s1){
        if(ch == ','){
            m.push_back(num);
            num = 0;
        }
        else{
            num *= 10;
            num += ch-'0';
        }
    }
    m.push_back(num);
}
int main(){
    // 输入数据处理
    string s1, s2;
    cin >> s1 >> s2;
    int k;
    cin >> k;
    vector<int> m, n;
    s2vec(s1, m);
    s2vec(s2, n);
    // 打印测试一下
//     for(int i : m){ cout << i << " "; }
//     cout << endl;
//     for(int i : n){ cout << i << " "; }
//     cout << endl;
    // 解题
    for(int i = 0; i < m.size(); ++i){
        if(m[i] < n[i]){
            k += n[i]-m[i];
        }
    }
    // 输出
    cout << k << endl;
    return 0;
}

第三题(80%通过):
题意:小明要练习超级左旋技巧,输入数据为多组一维数组,对于第i天的小明,如果前面天数的练习中,失误次数小于,技巧值就要加1,否则就减1。相等的话不变。要求输出每一组数据的最大技能获得值,以及最后的技能获得值。(题目有点绕,然后没时间去想优化了。

//
// Created by LJ on 2022/8/16.
//
#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main(){
    // 处理输入数据
    int T;
    cin >> T;
    vector<vector<int>> trains;
    for(int i = 0; i < T; ++i){
        int n;
        cin >> n;
        vector<int> tmp;
        for(int j = 0; j < n; ++j){
            int a;
            cin >> a;
            tmp.push_back(a);
        }
        trains.push_back(tmp);
    }
    // 打印输出
//    for(auto &it : trains){
//        for(auto i :it){
//            cout << i << " ";
//        }
//        cout << endl;
//    }
    // 暴力解题
    vector<vector<int>> ans;
    for(auto &it : trains){
        int maxValue = 0;
        int currValue = 0;
        for(int i = 1; i < it.size(); ++i){
            // 应该尝试用空间换时间,才能跑完所有案例
            for(int j = 0; j < i; ++j){
                if(it[i] > it[j]){ ++currValue; }
                else if(it[i] < it[j]){ --currValue; }
            }
            maxValue = max(maxValue, currValue);
        }
        ans.push_back({maxValue, currValue});
    }
    // 输出
    for(auto &it : ans){
        for(int i : it){ cout << i << " "; }
        cout << endl;
    }
    return 0;
}
#荣耀笔试##荣耀#
全部评论
借个楼,谢谢。有兴趣投荣耀但还在观望的同学们,抓紧时间冲啦,机会不等人,我可以内推。荣耀honor招聘官网https://www.hihonor.com/cn/career/ 内推码:yuhvad
1 回复 分享
发布于 2022-08-20 02:16 广东
到现在没收到机试…估计我没了😅
1 回复 分享
发布于 2022-08-20 12:22 河北
第三题思路一样,不过java就通过了20%难受
点赞 回复 分享
发布于 2022-08-16 20:40
第二题不用考虑买不起的情况吗?
点赞 回复 分享
发布于 2022-08-16 20:43
第三题树状数组
点赞 回复 分享
发布于 2022-08-16 21:17
发一个投票吧,请各位在下面点赞投下票,酱油给我点赞
点赞 回复 分享
发布于 2022-08-17 00:10 陕西
请问,前后端机试题一样吗
点赞 回复 分享
发布于 2022-08-17 09:25 广东
请问能用matlab吗
点赞 回复 分享
发布于 2022-08-20 10:52 上海
line = await readline() let total = +line let res = [] while (total--) { line = await readline() let days = +line line = await readline() let nums = line.split(' ').map(Number) let count = 0 let max = -Infinity let sorted = [] for (let i = 0; i < nums.length; i++) { let index = sorted.indexOf(nums[i]) if (index == -1) { sorted.push(nums[i]) if (sorted.length == 1) { max = count continue } let j = sorted.length - 1 for (; j > 0; j--) { if (sorted[j] < sorted[j - 1]) { [sorted[j], sorted[j - 1]] = [sorted[j - 1], sorted[j]]; } else { break } } count = count + j - (sorted.length - 1 - j) } else { count = count + index - (sorted.length - 1 - index) } if (count > max) { max = count } } let str = max + ' ' + count res.push(str) } res.forEach((item) => console.log(item))
点赞 回复 分享
发布于 2023-07-14 18:04 广东

相关推荐

不愿透露姓名的神秘牛友
11-27 10:46
点赞 评论 收藏
分享
11-13 20:32
门头沟学院 Java
面向未来编程code:我没看到他咋急,他不就问你个问题。。。
点赞 评论 收藏
分享
评论
1
45
分享
牛客网
牛客企业服务