华为上机题汇总(七)

华为上机题汇总(七)

注:编译环境为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;
}
时间: 2024-10-10 00:37:15

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

华为上机题汇总(二)

华为上机题汇总(二) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总二 目录 第六题 第七题 第八题 第九题 第十题 第六题 6.比较一个数组的元素 是否为回文数组(如abcdcba,hjjh) #include <iostream> #include <vector> #include <string> using namespace std; bool isPalindrome(const string &str){

华为上机题汇总(十四)

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

华为上机题汇总(十六)

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

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

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

华为上机题汇总(十五)

华为上机题汇总(十五) 注:编译环境为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.在给定字符串中找出单词( "单词"由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,如空格.问号.数字等等:另外单个字母不算单词):找到单词后,按照长度进行降序排序,(排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中:如果某个单词重复出现多次,则只输出一次:如