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

 题目:

主机名由多级域名组成,自右向左,依次是顶级域名、二级域名、三级域名…..以此类推
例,主机名: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 }

 

转载于:https://www.cnblogs.com/renzongxian/p/7608051.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值