华为上机题汇总(七)

华为上机题汇总(七)

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

目录

第三十一题

已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。经过的站点名分别如下,两条线交叉的换乘点用T1、T2表示。编写程序,任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量(含输入的起点和终点,换乘站点只计算一次)。
地铁线A(环线)经过车站:A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A18
地铁线B(直线)经过车站:B1 B2 B3 B4 B5 T1 B6 B7 B8 B9 B10 T2 B11 B12 B13 B14 B15

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

inline int min(int a, int b){
    return a > b ? b : a;
}

inline int max(int a, int b){
    return a < b ? b : a;
}

int minDistance(int station1, bool type1, int station2, bool type2){
    if (!type1 && !type2)
    {
        int minStation = min(station1, station2);
        int maxStation = max(station1, station2);
        return min(maxStation - minStation, minStation + 20 - maxStation);
    }
    else if (type1 && type2)
    {
        int minStation = min(station1, station2);
        int maxStation = max(station1, station2);
        return maxStation - minStation;
    }
    else if (!type1 && type2)
    {
        int d1 = minDistance(station1, type1, 10, type1) + minDistance(station2, type2, 6, type2);
        int d2 = minDistance(station1, type1, 15, type1) + minDistance(station2, type2, 12, type2);
        return min(d1, d2);
    }
    else
    {
        int d1 = minDistance(station1, type1, 6, type1) + minDistance(station2, type2, 10, type2);
        int d2 = minDistance(station1, type1, 12, type1) + minDistance(station2, type2, 15, type2);
        return min(d1, d2);
    }
}

int computeStation(const string &s, bool &type){
    const string tmp(s.begin()+1, s.end());
    int num = stoi(tmp);
    if (s[0] == 'A')
    {
        type = 0;
        if (num >= 10) num++;
        if (num >= 14) num++;
        return num;
    }
    else if (s[0] == 'B')
    {
        type = 1;
        if (num >= 6) num++;
        if (num >= 11) num++;
        return num;
    }
    return -1*num;
}

int passStations(const string &s1, const string &s2){
    bool type1 = 0, type2 = 0;
    int station1 = computeStation(s1, type1);
    int station2 = computeStation(s2, type2);
    if (station1 <= 0 && station2 <= 0)
    {
        return station1 == station2 ? 1 : 6;
    }
    else if (station1 <= 0)
    {
        if (station1 == -1) return min(minDistance(10,0,station2,type2), minDistance(6,1,station2,type2))+1;
        else return min(minDistance(15,0,station2,type2), minDistance(12,1,station2,type2))+1;
    }
    else if (station2 <= 0)
    {
        if (station2 == -1) return min(minDistance(10,0,station1,type1), minDistance(6,1,station1,type1))+1;
        else return min(minDistance(15,0,station1,type1), minDistance(12,1,station1,type1))+1;
    }
    else
    {
        return minDistance(station1,type1,station2,type2)+1;
    }
}

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

第三十二题

32.输入一串数,以’,’分隔,输出所有数中去掉最大值、最小值之后剩下的个数。(其中最大值与最小值可能有多个)
Smple input:3,3,5,3,6,9,7,9 Sample outPut: 3

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

int residualNum(const string &s){
    vector<int> v;
    auto begin = s.begin();
    while (begin != s.end())
    {
        auto ahead = begin + 1;
        while (ahead != s.end() && *ahead != ',')
        {
            ahead++;
        }
        string tmp(begin, ahead);
        v.push_back(stoi(tmp));
        if (ahead == s.end()) break;
        begin = ++ahead;
    }

    int min = v[0], max = v[0], minCount = 1, maxCount = 1;
    for (int i = 1; i < v.size(); i++)
    {
        if (v[i] < min){
            min = v[i];
            minCount = 1;
        }
        else if (v[i] == min)
        {
            minCount++;
        }

        if (v[i] > max){
            max = v[i];
            maxCount = 1;
        }
        else if (v[i] == max)
        {
            maxCount++;
        }
    }

    return v.size() - minCount - maxCount;
}

int main()
{
    string s;
    cin >> s;
    cout << residualNum(s) << endl;
    return 0;
}

第三十三题

33.要从5个人中选取2个人作为礼仪,其中每个人的身高范围为160-190,要求2个人的身高差值最小(如果差值相同的话,选取其中最高的两人),以升序输出两个人的身高。
Smple input:161 189 167 172 188 Sample outPut: 188 189

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

void selectMan(vector<int> &v, int &i1, int &i2){

    sort(v.begin(),v.end());
    int min = v[1] - v[0], index = 0;
    for (unsigned i = 1; i < v.size()-1; i++)
    {
        if (v[i+1] - v[i] <= min)
        {
            min = v[i+1] - v[i];
            index = i;
        }
    }
    i1 = v[index];
    i2 = v[index+1];
}

int main()
{
    vector<int> v;
    for (int i = 0; i < 5; i++)
    {
        int num;
        cin >> num;
        v.push_back(num);
    }
    int i1,i2;
    selectMan(v,i1,i2);
    cout << i1 << " " << i2 << endl;
    return 0;
}

第三十四题

34.输入一串字符串,其中有普通的字符与括号组成(包括‘(’、‘)’、‘[’,’]’),要求验证括号是否匹配,如果匹配则输出0、否则输出1.
Smple input:dfa(sdf)df[dfds(dfd)] Smple outPut:0

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

bool isMatch(const string &s){
    stack<char> charStack;
    for (auto begin = s.begin();begin != s.end();++begin){
        if (*begin == '(' || *begin == '[' || *begin == '{')
        {
            charStack.push(*begin);
            continue;
        }
        if (*begin == ')')
        {
            if (!charStack.empty() && charStack.top() == '(')
            {
                charStack.pop();
                continue;
            }
            return false;
        }
        if (*begin == ']')
        {
            if (!charStack.empty() && charStack.top() == '[')
            {
                charStack.pop();
                continue;
            }
            return false;
        }
        if (*begin == '}')
        {
            if (!charStack.empty() && charStack.top() == '{')
            {
                charStack.pop();
                continue;
            }
            return false;
        }
    }
    return !charStack.empty();
}

第三十五题

35.判断回文数,是返回1,不是返回0。

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

bool isPalindrome(int n){
    vector<int> v;
    while (n != 0)
    {
        v.push_back(n%10);
        n /= 10;
    }

    for (unsigned i = 0; i < v.size()/2; i++)
    {
        if (v[i] != v[v.size()-i-1])
        {
            return false;
        }
    }
    return true;
}

int main()
{
    int n;
    cin >> n;
    cout << isPalindrome(n) << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值