1. 程式人生 > >2018年華為軟體崗

2018年華為軟體崗

主機名由多級域名組成,自右向左,依次是頂級域名、二級域名、三級域名,例如huawei.com.cn,cn是頂級域名,com是二級域名,huawei是
三級域名。
請編寫一段程式,實現主機名排序功能,排序規則以及限制條件如下:
1、主機名按照域名等級排序,即先頂級域名排序,再二級域名排序,最後是三級域名排序;
2、每一級域名排序時,參考字典順序定義,abc 排在 abf,abc 排在 abcd 前。
3、輸入的主機名確保符合以下規則
A、主機名以字串形式給出,連續的兩個主機名,以’|’符號分開;
B、主機名中僅包含小寫英文字母和分隔符’.’;
C、主機名中沒有連續的’.’,不以’.’開始,也不以’.’結束;
D、主機名不存在重複。
輸入
輸入為字串,包含多個主機名,主機名之間以’|’符號分開。
輸出
輸出為經過排序後的字串,主機名之間以’|’符號分開。
樣例輸入
huawei.com.cn|mail.huawei.com|imail.huawei.com|cctv.com.cn|bctv.com.cn

樣例輸出
cctv.com.cn|huawei.com.cn|imail.huawei.com|mail.huawei.com
cctv.com.cn|huawei.com.cn|imail.huawei.com|mail.huawei.com

第三題:主機名排序

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

vector<string>
split(const string &s, const string &seperator){ vector<string> result; typedef string::size_type string_size; string_size i = 0; while (i != s.size()){ //找到字串中首個不等於分隔符的字母; int flag = 0; while (i != s.size() && flag == 0){ flag = 1
; for (string_size x = 0; x < seperator.size(); ++x) if (s[i] == seperator[x]){ ++i; flag = 0; break; } } //找到又一個分隔符,將兩個分隔符之間的字串取出; flag = 0; string_size j = i; while (j != s.size() && flag == 0){ for (string_size x = 0; x < seperator.size(); ++x) if (s[j] == seperator[x]){ flag = 1; break; } if (flag == 0) ++j; } if (i != j){ result.push_back(s.substr(i, j - i)); i = j; } } return result; } bool cmp(const vector<string> &a, const vector<string> &b){ bool flag = false;//預設由大到小輸出> int lena = a.size(); int lenb = b.size(); int len = min(lena, lenb); for (int i = 0; i<len; i++){ int resul = strcmp(a[lena - 1 - i].c_str(), b[lenb - 1 - i].c_str()); if ((i == len - 1) && (resul == 0)){//某一個主機名是另一個主機名的一部分時 if (len == lena) return true; else return false; } if (resul>0) return false; if (resul<0) return true; } return flag; } int main(){ string str; cin >> str; vector<string> hostnames = split(str, "|"); vector<vector<string>> namesplit; for (int i = 0; i<hostnames.size(); i++){ vector<string> tmp = split(hostnames[i], "."); namesplit.push_back(tmp); } sort(namesplit.begin(), namesplit.end(), cmp); for (int i = 0; i<namesplit.size(); i++){ vector<string> v=namesplit[i]; if (i>0) cout << "|"; for (int j = 0; j<v.size(); j++){ if (j>0) cout << "."; cout << v[j]; } } return 0; } 2、計算出版書的出版號,正確的出版號有4部分:x-xxx-xxxxx-x。第一部分是語言,第二部分是出版商的編號,第三部分是出版書籍的編號,第四部分是驗證碼,中間用分割符-分開。前123部分是數字0-9組組成的,第四部分是驗證碼:是前面9位數字,第一位*1+第二位*2+第三位+3+。。。第九位*9,最後的結果mod11,如果得到的是10,就讓驗證碼為x。最後輸出整個出版號。 輸入: x-xxx-xxxxx 輸出: 如果輸入不正確,輸出error。 否則輸出: x-xxx-xxxxx-x #include<iostream> #include <math.h> #include<string> using namespace std; int main(){ string strin; cin >> strin; if (strin.length() != 11){ cout << "ERROR" << endl; return 0; } long long sum = 0; int num = 0; int count = 1; for (int i = 0; i<11; i++){ if ((i != 1) && (i != 5)){ num = strin[i] - '0'; if (num>9 || num<0){ cout << "ERROR" << endl; return 0; } sum += num*count; count++; } } sum = fmod(sum, 11); if(sum==10) cout << strin << '-' << 'X' << endl; else cout << strin << '-' << sum << endl; return 0; } 1、輸入兩個字串,只要兩個字串中都有的字元,區分大小寫,則用'-'替換,其餘部分照常輸出,不得改變字元位置。 輸入: abc cddefd 輸出: ab_ _ddefd #include<iostream> #include<vector> #include<string> using namespace std; int main(){ string astr; cin>>astr; string a(astr) ; string bstr; cin>>bstr; string b(bstr); int alen=astr.length(); int blen=bstr.length(); for(int i=0;i<alen;i++){ for(int j=0;j<blen;j++){ if(astr[i]==bstr[j]){ a[i]='_'; b[j]='_'; } } } cout<<a<<endl; cout<<b<<endl; return 0; }