华为上机题汇总(七)
2016-08-12 13:06
483 查看
华为上机题汇总(七)
注:编译环境为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; }