主机名排序--华为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 }