华为上机题汇总(五)

华为上机题汇总(五)

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

目录

  • 华为上机题汇总五

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

第二十一题

21.通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。

输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。

补充说明:

1. 操作数为正整数,不需要考虑计算结果溢出的情况。

2. 若输入算式格式错误,输出结果为“0”。

示例

输入:“4 + 7” 输出:“11”

输入:“4 - 7” 输出:“-3”

输入:“9 ++ 7” 输出:“0” 注:格式错误

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

bool isNumber(const string &s , int &num){
    int sum = 0;
    for (auto begin = s.rbegin();begin != s.rend();begin++)
    {
        if (*begin < ‘0‘ || *begin > ‘9‘)
        {
            return false;
        }
        sum += (*begin - ‘0‘) * pow(10,begin - s.rbegin());
    }
    num = sum;
    return true;
}

int caculate(const string &s){
    if (s.empty()) return 0;
    auto begin = s.begin();

    vector<string> v;
    while (begin != s.end())
    {
        auto ahead = begin + 1;
        while (ahead != s.end() && *ahead != ‘ ‘)
        {
            ahead++;
        }
        string tmp(begin,ahead);
        v.push_back(tmp);
        if (ahead != s.end()) ahead++;
        begin = ahead;
    }
    if (v.size() != 3) return 0;
    int num1,num2;
    if (!isNumber(v[0],num1) || !isNumber(v[2],num2) || v[1].size() != 1) return 0;

    if (v[1] == "+")
    {
        return num1 + num2;
    }
    else if (v[1] == "-")
    {
        return num1 - num2;
    }
    return 0;
}

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

第二十二题

22.IP地址匹配(60分)

问题描述:

在路由器中,一般来说转发模块采用最大前缀匹配原则进行目的端口查找,具体如下:

IP地址和子网地址匹配:

IP地址和子网地址所带掩码做AND运算后,得到的值与子网地址相同,则该IP地址与该子网匹配。

比如:

IP地址:192.168.1.100

子网:192.168.1.0/255.255.255.0,其中192.168.1.0是子网地址,255.255.255.0是子网掩码。

192.168.1.100&255.255.255.0 = 192.168.1.0,则该IP和子网192.168.1.0匹配

IP地址:192.168.1.100

子网:192.168.1.128/255.255.255.192

192.168.1.100&255.255.255.192 = 192.168.1.64,则该IP和子网192.168.1.128不匹配

最大前缀匹配:

任何一个IPv4地址都可以看作一个32bit的二进制数,比如192.168.1.100可以表示为:11000000.10101000.00000001.01100100,

192.168.1.0可以表示为11000000.10101000.00000001.00000000

最大前缀匹配要求IP地址同子网地址匹配的基础上,二进制位从左到右完全匹配的位数尽量多(从左到右子网地址最长)。比如:

IP地址192.168.1.100,同时匹配子网192.168.1.0/255.255.255.0和子网192.168.1.64/255.255.255.192,

但对于子网192.168.1.64/255.255.255.192,匹配位数达到26位,多于子网192.168.1.0/255.255.255.0的24位,

因此192.168.1.100最大前缀匹配子网是192.168.1.64/255.255.255.192。

请编程实现上述最大前缀匹配算法。

要求实现函数:

void max_prefix_match(const char *ip_addr, const char *net_addr_array[], int *n)

【输入】ip_addr:IP地址字符串,严格保证是合法IPv4地址形式的字符串

net_addr_array:子网地址列表,每一个字符串代表一个子网,包括子网地址和掩码,

表现形式如上述,子网地址和子网掩码用’/’分开,严格保证是

合法形式的字符串;如果读到空字符串,表示子网地址列表结束

【输出】n:最大前缀匹配子网在*net_addr_array[]数组中对应的下标值。如果没有匹配返回-1

示例

输入:

ip_addr = “192.168.1.100”

net_addr_array[] =

{

“192.168.1.128/255.255.255.192”,

“192.168.1.0/255.255.255.0”,

“192.168.1.64/255.255.255.192”,

“0.0.0.0/0.0.0.0”,

“”

}

输出:n = 2

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

void convert(const char *ip,vector<int> &v){
    const char *begin = ip, *ahead;
    while (*begin != ‘\0‘)
    {
        ahead = begin + 1;
        while (*ahead != ‘\0‘ && *ahead != ‘.‘ && *ahead != ‘/‘)
        {
            ahead++;
        }
        string tmp(begin,ahead);
        v.push_back(stoi(tmp));
        if (*ahead == ‘\0‘) break;
        begin = ++ahead;
    }
}

int match(const char *ip, const char *net){
    vector<int> vIp;
    vector<int> vNet;
    convert(ip,vIp);
    convert(net,vNet);

    for (int i = 0; i < 4; i++)
    {
        int tmp = vIp[i] & vNet[4+i];
        if (tmp != vNet[i])
        {
            return -1;
        }
    }

    int matchByte = 0;
    for (int i = 0; i < 4; i++)
    {
        if (vIp[i] == vNet[i])
        {
            matchByte += 8;
            continue;
        }

        int tmp = vIp[i] ^ vNet[i];
        int index = 0;
        for (int i = 7; i > 0; i--)
        {
            if (tmp & 1)
            {
                index = i;
            }
            tmp >>= 1;
        }
        matchByte += index;
        break;
    }
    return matchByte;
}

void max_prefix_match(const char *ip_addr, const char *net_addr_array[], int *n){
    int index = 0, maxIndex = -1, maxByte = -1;
    while (*net_addr_array != "")
    {
        int matchByte = match(ip_addr,*net_addr_array++);
        if (matchByte > maxByte)
        {
            maxIndex = index;
            maxByte = matchByte;
        }
        index++;
    }
    *n = maxIndex;
}

int main()
{
    const char * ip_addr = "192.168.1.100";
    const char * net_addr_array[] = {"192.168.1.128/255.255.255.192",
                               "192.168.1.0/255.255.255.0",
                               "192.168.1.64/255.255.255.192",
                               "0.0.0.0/0.0.0.0",
                               ""};
    int n = 0;
    max_prefix_match(ip_addr,net_addr_array,&n);
    cout << n << endl;
    return 0;
}

第二十三题

23.编写一个程序,实现排序算法,从小到大输出,数字间以逗号分隔,所有数字为非负整数。数目小于1028;

输入:1,6,3,5

输出:1,3,5,6

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

void sortStr(const string &input, string &output){
    vector<int> v;
    auto begin = input.begin();
    while (begin != input.end())
    {
        auto ahead = begin + 1;
        while (ahead != input.end() && *ahead != ‘,‘)
        {
            ahead++;
        }
        string tmp(begin,ahead);
        v.push_back(stoi(tmp));
        if (ahead == input.end()) break;
        begin = ++ahead;
    }

    sort(v.begin(),v.end());

    auto vbegin = v.begin();
    while (vbegin != v.end())
    {
        output += to_string(*vbegin++);
        if (vbegin != v.end())
        {
            output.push_back(‘,‘);
        }
    }
}

int main()
{
    string input,output;
    getline(cin,input);
    sortStr(input,output);
    cout << output << endl;
    return 0;
}

第二十四题

24.我们把只包含因子2,3,5的数称为丑数,把1当作第一个丑数,求从小到大的第n个丑数

输入:1都500之间的整数(包含1和500)

输出:第n个丑数。不在1-500输出-1

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

int min(int a, int b , int c){
    int tmp = a < b ? a : b;
    return tmp < c ? tmp : c;
}

int findArglyNum(int n){

    if (n < 1 || n >500)
    {
        return -1;
    }

    vector<int> v(n,1);
    int pos2 = 0, pos3 = 0, pos5 = 0;
    for (int i = 1; i < n; i++)
    {
        v[i] = min(2*v[pos2],3*v[pos3],5*v[pos5]);
        if (v[i] == 2*v[pos2])
        {
            pos2++;
        }
        if (v[i] == 3*v[pos3])
        {
            pos3++;
        }
        if (v[i] == 5*v[pos5])
        {
            pos5++;
        }
    }
    return v[n-1];
}

int main()
{
    int n;
    cin >> n;
    cout << findArglyNum(n) << endl;
    return 0;
}

第二十五题

N个城市(N<=10),从0到9编号,城市间要么有路,要么没路,计算城市A到B之间到底有多少条路。

输入:N A B(1<N<=10,0<=A,B<=9)A为出发城市,B为目的城市。然后n行表示行编号的城市到其他城市有没有路,0表示没有,1表示有路。

输出:A到B有多少条路

输入:3 0 2

1 1 1

1 1 1

1 1 1

输出:2

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

bool canVisit(int index, vector<int> hasVisited){
    for (auto begin = hasVisited.begin();begin != hasVisited.end();begin++)
    {
        if (index == *begin)
        {
            return false;
        }
    }
    return true;
}

int findWay(int start, int end, int n, vector<int> hasVisited, vector<vector<int>> road){
    if (start == end)
    {
        return 1;
    }
    int sum = 0;
    vector<int> v = road[start];
    for (int i = 0; i < n; i++)
    {
        if (!v[i]) continue;
        if (canVisit(i,hasVisited))
        {
            hasVisited.push_back(i);
            sum += findWay(i,end,n,hasVisited,road);
        }
    }
    return sum;
}

int main()
{
    int n, a, b;
    cin >> n >> a >> b;
    vector<vector<int>> road;
    for (int i = 0; i < n; i++)
    {
        vector<int> v;
        for (int j = 0; j < n; j++)
        {
            int x;
            cin >> x;
            v.push_back(x);
        }
        road.push_back(v);
    }
    vector<int> hasVisited;
    hasVisited.push_back(a);

    cout << findWay(a,b,n,hasVisited,road) << endl;
    return 0;
}
时间: 2024-07-31 02:16:22

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

华为上机题汇总(十五)

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

华为上机题汇总(六)

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

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

华为上机题汇总(二十) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总二十 目录 第一百零一题 第一百零二题 第一百零三题 第一百零四题 第一百零五题 第一百零一题 101.合唱队问题 问题描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2-,K,他们的身高分别为T1,T2,-,TK, 则他们的身高满足T1<-Ti+1>->TK(1<

华为上机题汇总(十三)

华为上机题汇总(十三) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总十三 目录 第六十一题 第六十二题 第六十三题 第六十四题 第六十五题 第六十一题 61.给一个数组,输出数组里超出所有元素平均值的元素的个数.比如:1.2.3.4.5,输出3. #include <iostream> using namespace std; int overAvg(int a[],int n){ int sum = 0, count = 0; for (int i

华为上机题汇总(十)

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

华为上机题汇总(十二)

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

华为上机题汇总(一)

华为上机题汇总(一) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总一 目录 第一题 第二题 第三题 第四题 第五题 第一题 1.给定一个字符串,把字符串内的字母转换成该字母的下一个字母,a换成b,z换成a,Z换成A,如aBf转换成bCg,字符串内的其他字符不改变,给定函数,编写函数 void Stringchang(const char *input,char *output) 其中input是输入字符串,output是输出字符串 #include <

华为上机题汇总(十六)

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

华为上机题汇总(三)

华为上机题汇总(三) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总三 目录 第十一题 第十二题 第十三题 第十四题 第十五题 第十一题 11.选秀节目打分,分为专家评委和大众评委,score[] 数组里面存储每个评委打的分数,judge_type[] 里存储与 score[] 数组对应的评委类别,judge_type[i] == 1,表示专家评委,judge_type[i] == 2,表示大众评委,n表示评委总数.打分规则如下:专家评委和大众评委的分数