主机名排序--华为2018校招笔试题

时间:2020-12-01 18:54:34

 题目:

主机名由多级域名组成,自右向左,依次是*域名、二级域名、三级域名…..以此类推
例,主机名:google.com.hk
hk是*域名
com是二级域名
google是三级域名

现在我们需要实现一个主机名的排序功能

排序规则
1)主机名按照域名等级排序,即先按照*域名排序,*域名相同的再按照二级域名排序,*和二级域名均相同的再按照三级域名排序,以此类推,直到整个主机名排序完毕
2)如果短主机名是由长主机名从*域名开始的连续一个或多个域名组成,短主机名排在长主机名前面。例:google.com 排在gmail.google.com 之前
3)每一级域名按照字典顺序排序,字典顺序定义见下页

输入确保符合以下规则(无需检查)
1)主机名以字符串形式给出,非空串
2)主机名中仅包含小写英文字母和分隔符’.’
3)主机名中没有连续的’.’,不以’.’开始,也不以’.’结束
3)主机名不存在重复

字典顺序定义

1、两个单词(字母按照自左向右顺序)先以第一个字母作为排序的基准,如果第一个字母相同,就用第二个字母为基准,如果第二个字母相同就以第三个字母为基准。依此类推,如果到某个字母不相同,字母顺序在前的那个单词顺序在前。例:abc 排在 abf 之前

2、如果短单词是长单词从首字母开始连续的一部分,短单词顺序在前。例:abc 排在 abcd 之前

 1 import java.util.Scanner;
2
3 public class Main {
4 /**
5 * 主机名比较
6 * @param hostname1
7 * @param hostname2
8 * @return
9 */
10 private int compareHostname(String hostname1, String hostname2) {
11 int rlt = 0;
12 String[] domainArr1 = hostnameSplit(hostname1);
13 String[] domainArr2 = hostnameSplit(hostname2);
14 for(int i=0; i< Math.min(domainArr1.length, domainArr2.length); i++) {
15 rlt = domainArr1[i].compareTo(domainArr2[i]);
16 if(rlt != 0) {
17 return rlt;
18 }
19 }
20 if(domainArr1.length > domainArr2.length) {
21 rlt = 1;
22 } else if (domainArr1.length == domainArr2.length) {
23 rlt = 0;
24 } else {
25 rlt = -1;
26 }
27 return rlt;
28 }
29
30 /**
31 * 主机名拆分成域名,且按*域名、二级域名、三级域名……的顺序
32 * @param hostname
33 * @return
34 */
35 private String[] hostnameSplit(String hostname) {
36 String[] domainArr = hostname.split("\\.");
37 String[] reverseDomainArr = new String[domainArr.length];
38 for(int i=0; i<domainArr.length; i++) {
39 reverseDomainArr[domainArr.length-1-i] = domainArr[i];
40 }
41 return reverseDomainArr;
42 }
43
44 /**
45 * 交换数组元素
46 * @param arr
47 * @param i
48 * @param j
49 */
50 private void swap(String[] arr, int i, int j) {
51 String tmp = arr[i];
52 arr[i] = arr[j];
53 arr[j] = tmp;
54 }
55
56 /**
57 * 主机名快速排序
58 * @param hostnameArr
59 */
60 private void quickSort(String[] hostnameArr, int left, int right) {
61 if(left >= right) {
62 return;
63 }
64 int low = left, high = right;
65 String key = hostnameArr[low];
66 while(low < high) {
67 while(low < high && compareHostname(hostnameArr[high], key) > 0) {
68 high--;
69 }
70 swap(hostnameArr, low, high);
71 while(low < high && compareHostname(hostnameArr[low], key) < 0) {
72 low++;
73 }
74 swap(hostnameArr, low, high);
75 }
76 quickSort(hostnameArr, left, low-1);
77 quickSort(hostnameArr, low+1, right);
78 }
79
80 public static void main(String[] args) {
81 Main m = new Main();
82 Scanner in = new Scanner(System.in);
83 while (in.hasNext()) {//注意while处理多个case
84 String str = in.next();
85 String[] hostnameArr = str.split("\\|");
86 m.quickSort(hostnameArr, 0, hostnameArr.length-1);
87 StringBuilder sb = new StringBuilder();
88 for(int i=0; i< hostnameArr.length; i++) {
89 sb.append(hostnameArr[i]);
90 if(i != hostnameArr.length - 1) {
91 sb.append("|");
92 }
93 }
94 System.out.println(sb.toString());
95 }
96 in.close();
97 }
98 }