华为笔试:域名排序
2017-09-27 12:23
435 查看
1. 题目描述
主机名由多级域名组成,自右向左,依次是顶级域名、二级域名、三级域名……以此类推。例如:主机名: google.com.hk
hk是顶级域名
com是二级域名
google是三级域名
现在我们需要实现一个主机名的排序功能
排序规则:
(1)主机名按照域名等级排序,即先按照顶级域名排序,顶级域名相同的再按照二级域名排序,顶级域名和二级域名均相同的再按照三级域名排序,以此类推,知道整个主机名排序完毕
(2)如果短主机名是长主机名从顶级域名开始的连续一个或多个域名组成,段主机名排在长主机名前面。例:google.com排在gmail.google.com前面
(3)每一级域名按照字典顺序排序,字典顺序定义如下:
a) 两个单词(字母按照自左向右顺序),先以第一个字母作为排序的基准,如果第一个字母相同,就用第二个字母为基准,如果第二个字母相同,就以第三个字母为基准。以此类推,如果到某个字母不相同,字母顺序在前的那个单词顺序在前。如:abc排在abf之前
b) 如果段单词是场单词从首字母开始连续的一部分,段单词顺序在前。如:abc排在abcd之前
(4)此处输入输出符合一下规则(无需检查):
a) 主机名以字符串形式给出,非空转
b) 主机名中仅包含小写英文字母和分隔符”.”
c) 主机名中没有连续的“.”,不以”.”开头、结尾
d) 主机名不存在重复
输入描述:
不超过255个字符的字符串,不同的域名间用字符“|”进行分隔
输出描述:
排序后的域名,域名间用字符“|”进行分隔
示例输入:
mail.huawei.com|huawei.com|teltalk.org|google.com.hk|imail.huawei.com
示例输出:
huawei.com|imail.huawei.com|mail.huawei.com|google.com.hk|teltalk.com
2. 思路分析
根据输入形式可以很清晰的看出,第一步操作应该对输入的字符串进行分隔,取出每一个域名。其次,题目描述中提到的域名排序是从顶级域名开始判断的,所以为了比较方便,在比较时需要将域名字符串进行分隔并倒置。然后重写比较函数。比较函数的写法:取两个字符串较短的长度作为比较长度,如果长度内均相等,则短串大于长串,否则按字典排序。
3. c++实现
#include "stdafx.h" #include <string> #include <vector> #include <iostream> #include <algorithm> using namespace std; // 字符串分隔 vector<string> splitbychar(string s, char c) { vector<string> afterSplit; if (s.empty()) return afterSplit; string tmp = ""; for (int i = 0; i < s.size(); i++) { if (s[i] != c) { tmp += s[i]; } else { afterSplit.push_back(tmp); tmp = ""; } } afterSplit.push_back(tmp); return afterSplit; } // 比较函数重载 bool Less(const string& s1, const string& s2) { vector<string> strs1 = splitbychar(s1, '.'); vector<string> strs2 = splitbychar(s2, '.'); reverse(strs1.begin(), strs1.end()); reverse(strs2.begin(), strs2.end()); int length = strs1.size() < strs2.size() ? strs1.size() : strs2.size(); for (int i = 0; i < length; i++) { if (strs1[i] != strs2[i]) return strs1[i] < strs2[i]; } int len = strs1.size() - strs2.size(); return len < 0; } int main() { string input = "mail.huawei.com|huawei.com|teltalk.org|google.com.hk|imail.huawei.com"; vector<string> domain; domain = splitbychar(input, '|'); sort(domain.begin(), domain.end(), Less); int i; for (i = 0; i < domain.size() - 1; i++) { cout << domain[i] << "|"; } cout << domain[i] << endl; return 0; }
相关文章推荐
- 华为研发笔试(随机数查重删除并排序)
- 华为笔试1 去除重复字符并排序的字符串 c++ string 实现
- 华为笔试题---“去重”与“排序”
- 华为笔试-字符串拆分和排序
- 主机名排序--华为2018校招笔试题
- 华为2017实习生招聘笔试题-公司年会
- 九月百度,迅雷,华为,阿里巴巴,最新校招笔试面试十题 .
- 转:华为笔试(网络篇)
- 华为的笔试题
- 九月十月百度,迅雷,华为,阿里巴巴笔试面试六十题(第411~470题)
- 华为笔试 软件
- 笔试面试算法经典-未排序正整数数组中累加和为给定值的子数组
- 创建一个静态方法,给它传入一个对象,请循环的打印出该对象所在类的类名和所实现的方法名(华为笔试)
- 华为C语言笔试题
- 华为2015实习上机:字符串排序
- 华为笔试题2
- 百度 阿里 华为 腾讯 谷歌面试笔试题及解析
- 华为招聘机试整理14:数组奇数偶数排序
- 华为机试—差值排序
- 华为机试——字符串排序