华为笔试:域名排序

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 
#include 
#include 
#include 

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;
}

你可能感兴趣的:(华为笔试:域名排序)