华为上机题汇总(十九)

华为上机题汇总(十九)

注:编译环境为Visual Studio 2012,答案仅供参考。

目录

  • 华为上机题汇总十九

    • 目录
    • 第九十一题
    • 第九十二题
    • 第九十三题
    • 第九十四题
    • 第九十五题

第九十一题

91.按照指定规则对输入的字符串进行处理。

详细描述:

将输入的两个字符串合并。

对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标意思是字符在字符串中的位置。

对排训后的字符串进行操作,如果字符为‘0’——‘9’或者‘A’——‘F’或者‘a’——‘f’,则对他们所代表的16进制的数进行BIT倒序的操作,并转换为相应的大写字符。如字符为‘4’,为0100b,则翻转后为0010b,也就是2。转换后的字符为‘2’; 如字符为‘7’,为0111b,则翻转后为1110b,也就是e。转换后的字符为大写‘E’。

举例:输入str1为”dec”,str2为”fab”,合并为“decfab”,分别对“dca”和“efb”进行排序,排序后为“abcedf”,转换后为“5D37BF”.

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

int convertNum(int n){
    int sum = 0;
    vector<int> v;
    while (n != 0)
    {
        v.push_back(n%2);
        n /= 2;
    }
    for (unsigned i = 0; i < v.size(); i++)
    {
        sum += v[i] * (int)pow(2,v.size()-1-i);
    }
    return sum;
}

char convert(char c){
    int n;
    if (c >= ‘0‘ && c <= ‘9‘)
    {
        n = c - ‘0‘;
    }
    else if (c >= ‘a‘ && c <= ‘f‘)
    {
        n = c - ‘a‘ + 10;
    }
    else if (c >= ‘A‘ && c <= ‘F‘)
    {
        n = c - ‘A‘ + 10;
    }
    else
    {
        return c;
    }
    n = convertNum(n);
    if (n < 10)
    {
        return n + ‘0‘;
    }
    else
    {
        return n - 10 + ‘A‘;
    }
}

void copySub(string &s, const string &tmp, int flag){
    for (unsigned i = 0; i < tmp.size(); i++)
    {
        s[i*2+flag] = tmp[i];
    }
}

void deal(const string &s1, const string &s2, string &output){
    string s = s1 + s2, tmp1, tmp2;
    for (unsigned i = 0; i < s.size(); i++)
    {
        i % 2 == 0 ? tmp1.push_back(s[i]) : tmp2.push_back(s[i]);
    }
    sort(tmp1.begin(),tmp1.end());
    sort(tmp2.begin(),tmp2.end());
    copySub(s,tmp1,0);
    copySub(s,tmp2,1);
    for (unsigned i = 0; i < s.size(); i++)
    {
        output.push_back(convert(s[i]));
    }
}

int main()
{
    string s1,s2,output;
    cin >> s1 >> s2;
    deal(s1,s2,output);
    cout << output << endl;
    return 0;
}

第九十二题

92.控制输入一个字符串,然后将字符串里面的单词按照原排列顺序的逆序输出,如输入为:i am a boy.则输出为:boy a am i.

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

void convert(string &input){
    auto begin = input.begin();
    while (begin != input.end())
    {
        if (*begin == ‘ ‘)
        {
            begin++;
            continue;
        }
        auto ahead = begin + 1;
        while (ahead != input.end() && *ahead != ‘ ‘)
        {
            ahead++;
        }
        reverse(begin,ahead);
        begin = ahead;
    }
    reverse(input.begin(),input.end());
}

int main()
{
    string s;
    getline(cin,s);
    convert(s);
    cout << s << endl;
    return 0;
}

第九十三题

93.求两个数的最小公倍数。

输入:2 3

输出:6

#include<iostream>
using namespace std;

int greatestDivisor(int n, int m){
    int n1 = n > m ? n : m;
    int n2 = n + m - n1;
    while (n1 % n2 != 0)
    {
        int div = n1 % n2;
        n1 = n2;
        n2 = div;
    }
    return n2;
}

int leastMutiple(int n, int m){
    int div = greatestDivisor(n,m);
    return m * n / div;
}

int main()
{
    int n, m;
    cin >> n >> m;
    cout << leastMutiple(n,m) << endl;
    return 0;
}

第九十四题

94.中国有句俗语叫“三天打鱼两天晒网”,给定起始日期为1990年1月1号,输入终止日期,计算终止日期是在打渔还是晒网,打渔输出Fishing,晒网输出Netting。

输入:1990 01 04

输出:Netting

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

int MonthDays[] = {31,28,31,30,31,30,31,31,30,31,30,31};

bool isLeapYear(int year){
    if (year % 100 == 0)
    {
        return year % 400 == 0;
    }
    return year % 4 == 0;
}

bool isFishing(const string &yearStr, const string &monthStr, const string &dayStr){
    int year = stoi(yearStr), month = stoi(monthStr), day = stoi(dayStr), sum = -1;
    for (int i = 1990; i < year; i++)
    {
        sum += isLeapYear(i) ? 366 : 365;
    }
    for (int i = 1; i < month; i++)
    {
        sum += MonthDays[i-1];
    }
    if (month > 2 && isLeapYear(year)) sum++;
    sum += day;
    if (sum % 5 < 3)
    {
        return true;
    }
    return false;
}

int main()
{
    string s1,s2,s3;
    cin >> s1 >> s2 >> s3;
    cout << (isFishing(s1,s2,s3) ? "Fishing" : "Netting") << endl;
    return 0;
}

第九十五题

95.公司设备管理

公司设备管理系统,某公司有许多员工和设备,每个员工有一个8位数字组成的ID,每台设备有个小于等于20位由数字和字母组成的设备号。

每个员工可以拥有多台设备,但是每台设备只能分配给一个员工使用。

输入四个数a,b,c,d

a:给这个系统添加多少台设备

b:从这个系统中删除多少台设备

c:添加设备和员工的对应关系

d:删除设备和员工的对应关系

之后是由这4个参数控制的输入序列

a行设备编号,若添加失败则输出”add computers error:”+设备号;成功不输出

b行删除设备的编号,若删除失败则输出”remove computers error:”+设备号;成功不输出

c行要分配给员工的设备,若添加失败则输出“assign computer error:”+设备号+“_”+员工号;成功不输出

d行要删除分配给员工的设备,若删除失败则输出”remover computer from worker error:”+设备号+“_”+员工号;成功不输出

最后要求输出总共的设备数目和排序输出员工和设备的对应关系(员工号+”_”+设备号)(先按照员工号进行排序,若员工有多台设备,则再按照设备号进行排序)。

如输入

3 2 2 1

SN001

SN002

SN003

SN003

SN004

SN002 12345678

SN001 12345678

SN001 12345678

输出:

remove computers error:SN004

1

12345678_SN002

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

struct Employee
{
    int id;
    vector<string> equipments;
};

int indexOfEmployee(const vector<Employee> &v, int id){
    for (unsigned i = 0; i < v.size(); i++)
    {
        if (v[i].id == id)
        {
            return i;
        }
    }
    return -1;
}

int indexOfEquipment(const vector<string> &v, const string &s){
    for (unsigned i = 0; i < v.size(); i++)
    {
        if (v[i] == s)
        {
            return i;
        }
    }
    return -1;
}

void startAssign(){
    int a, b, c, d;
    cin >> a >> b >> c >> d;
    vector<string> eq;
    vector<Employee> ey;
    string tmp;
    int tmpN;
    while (a-- > 0)
    {
        cin >> tmp;
        if (tmp.size() > 20)
        {
            cout << "add computers error:" << tmp << endl;
            continue;
        }
        eq.push_back(tmp);
    }
    while (b-- > 0)
    {
        cin >> tmp;
        int index = indexOfEquipment(eq,tmp);
        if (index == -1)
        {
            cout << "remove computers error:" << tmp << endl;
            continue;
        }
        eq.erase(eq.begin()+index);
    }
    while (c-- > 0)
    {
        cin >> tmp >> tmpN;
        if (indexOfEquipment(eq,tmp) == -1 || tmp.size() > 20)
        {
            cout << "assign computer error:" << tmp << "_" << tmpN << endl;
            continue;
        }
        int index = indexOfEmployee(ey,tmpN);
        if (index == -1)
        {
            Employee e;
            vector<string> ee;
            ee.push_back(tmp);
            e.id = tmpN;
            e.equipments = ee;
            ey.push_back(e);
            continue;
        }
        ey[index].equipments.push_back(tmp);
    }
    while (d-- > 0)
    {
        cin >> tmp >> tmpN;
        int index = indexOfEmployee(ey,tmpN);
        if (index == -1)
        {
            cout << "emover computer from worker error:" << tmp << "_" << tmpN << endl;
            continue;
        }
        Employee &e = ey[index];
        int eIndex = indexOfEquipment(e.equipments,tmp);

        if (eIndex == -1)
        {
            cout << "emover computer from worker error:" << tmp << "_" << tmpN << endl;
            continue;
        }
        e.equipments.erase(e.equipments.begin()+eIndex);
        eq.erase(eq.begin()+indexOfEquipment(eq,tmp));
    }

    cout << eq.size() << endl;
    sort(ey.begin(),ey.end(),[](const Employee &e1, const Employee &e2){
        return e1.id < e2.id;
    });
    for (unsigned i = 0; i < ey.size(); i++)
    {
        Employee e = ey[i];
        vector<string> ee = e.equipments;
        sort(ee.begin(),ee.end());
        for (unsigned j = 0; j < ee.size(); j++)
        {
            cout << e.id << "_" << ee[j] << endl;
        }
    }
}

int main()
{
    startAssign();
    return 0;
}
时间: 2024-08-18 19:01:53

华为上机题汇总(十九)的相关文章

华为上机题汇总(十四)

华为上机题汇总(十四) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总十四 目录 第六十六题 第六十七题 第六十八题 第六十九题 第七十题 第六十六题 66.问题描述 股票是一种有价证券,是股份公司为筹集资金发给投资者作为公司资本部分所有权的凭证,成为股东以此获得股息(股利),并分享公司成长或交易市场波动带来的利润:但也要共同承担公司运作错误所带来的风险.南邮华为俱乐部会长小郑同学最近计划进入股市淘金,看中一支股票,借本次华为赛机会,请你帮忙指出:何时买

华为上机题汇总(十)

华为上机题汇总(十) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总十 目录 第四十六题 第四十七题 第四十八题 第四十九题 第五十题 第四十六题 46.在给定字符串中找出单词( "单词"由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,如空格.问号.数字等等:另外单个字母不算单词):找到单词后,按照长度进行降序排序,(排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中:如果某个单词重复出现多次,则只输出一次:如

华为上机题汇总(十二)

华为上机题汇总(十二) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总十二 目录 第五十六题 第五十七题 第五十八题 第五十九题 第六十题 第五十六题 56.在中国,形容夫妻恩爱的词汇中,大家用的比较多的就是"夫妻相".所谓"夫妻相",就是两个人看上去比较般配,长相.身材等某些方面有一定的相似度.本题则另辟蹊径,从人的姓名维度,以字母重复个数来寻找最具"夫妻相"的人. 题目中预先给定一组女士的姓名拼音.输

华为上机题汇总(十八)

华为上机题汇总(十八) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总十八 目录 第八十六题 第八十七题 第八十八题 第八十九题 第九十题 第八十六题 86.合并输入的两个整形数组并去掉重复的数字按升序输出: 案例输入:3 1 2 5 -10 3 2 案例输出:-10 1 2 3 5 #include <iostream> #include <vector> #include <algorithm> using namespac

华为上机题汇总(十六)

华为上机题汇总(十六) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总十六 目录 第七十六题 第七十七题 第七十八题 第七十九题 第八十题 第七十六题 消除类游戏很多,一般横.竖.斜有连续三个及以上相同就可以消除,为降低难度,本题只需要考虑一维的横消除即可, 即在给定的一组数字中(个,用例保证只有个),如果有连续三个及以上的数字相同,则将这些数字消除, 同时如果前一次消除后导致后面连在一起的也有三个及以上的数字相同,需继续消除,最终输出不能消除的剩余的数

华为上机题汇总(十五)

华为上机题汇总(十五) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总十五 目录 第七十一题 第七十二题 第七十三题 第七十四题 第七十五题 第七十一题 71.渡口问题: 同类车辆先来先上,客车优于货车,客车上了4辆后才可以上货车,客车不足4辆可用货车补充. 客车为0,货车为1 输入:5 00101 输出:01324 #include <iostream> #include <queue> #include <vector> u

华为上机题汇总(二十)

华为上机题汇总(二十) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总二十 目录 第九十六题 第九十七题 第九十八题 第九十九题 第一百题 第九十六题 96 . 给分数的循环节加括号 两个整数相除,将结果用字符串返回.如果是循环小数,将循环的位用括号括起来. 输入:1 3 输出:0.(3) 输入 1 7 输出 0.(142857) #include <iostream> #include <string> using namespace s

华为上机题汇总(二十二)

华为上机题汇总(二十二) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总二十二 目录 第一百零六题 第一百零七题 第一百零八题 第一百零九题 第一百一十题 第一百一十一题 第一百零六题 106.去饭店吃饭 一个男人3元 一个女人2元 一个小孩1元 现输入总人数和总花费 #include <iostream> #include <vector> using namespace std; void display(const vector<

华为上机题汇总(六)

华为上机题汇总(六) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总六 目录 第二十六题 第二十七题 第二十八题 第二十九题 第三十题 第二十六题 26.一副牌中发五张扑克牌给你:让你判断数字的组成: 有以下几种情况: 1:四条:即四张一样数值的牌(牌均不论花色)2:三条带 一对 3:三条带两张不相同数值的牌 4:两对 5:顺子 包括 10,J,Q,K,A 6:什么都不是 7:只有一对 #include <iostream> #include <