主機名由多級域名組成,自右向左,依次是頂級域名、二級域名、三級域名…..以此類推
例,主機名:google.com.hk
hk是頂級域名
com是二級域名
google是三級域名
如今咱們須要實現一個主機名的排序功能
排序規則
1)主機名按照域名等級排序,即先按照頂級域名排序,頂級域名相同的再按照二級域名排序,頂級和二級域名均相同的再按照三級域名排序,以此類推,直到整個主機名排序完畢
2)若是短主機名是由長主機名從頂級域名開始的連續一個或多個域名組成,短主機名排在長主機名前面。例:google.com 排在gmail.google.com 以前
3)每一級域名按照字典順序排序,字典順序定義見下頁
輸入確保符合如下規則(無需檢查)
1)主機名以字符串形式給出,非空串
2)主機名中僅包含小寫英文字母和分隔符’.’
3)主機名中沒有連續的’.’,不以’.’開始,也不以’.’結束
3)主機名不存在重複
字典順序定義
一、兩個單詞(字母按照自左向右順序)先以第一個字母做爲排序的基準,若是第一個字母相同,就用第二個字母爲基準,若是第二個字母相同就以第三個字母爲基準。依此類推,若是到某個字母不相同,字母順序在前的那個單詞順序在前。
例:abc 排在 abf 以前
二、若是短單詞是長單詞從首字母開始連續的一部分,短單詞順序在前。
例:abc 排在 abcd 以前java
測試用例:測試
public class DemoTest extends TestCase { // tearDown: 在每一個用例後執行一次 protected void tearDown() { Demo.clear(); } // 序列號越界 public void testCase01() { String[] input = { "mail.huawei.com", "huawei.com", "teltalk.org", "google.com.hk", "imail.huawei.com" }; for (int i = 0; i < input.length; ++i) { assertEquals(0, Demo.add_host_name(input[i])); } assertEquals(null, Demo.get_host_name(6)); } // 樣例用例:mail.huawei.com huawei.com teltalk.org google.com.hk // imail.huawei.com public void testCase02() { String[] input = { "mail.huawei.com", "huawei.com", "teltalk.org", "google.com.hk", "imail.huawei.com" }; String[] expect = { "huawei.com", "imail.huawei.com", "mail.huawei.com", "google.com.hk", "teltalk.org" }; for (int i = 0; i < input.length; ++i) { assertEquals(0, Demo.add_host_name(input[i])); } for (int i = 0; i < input.length; ++i) { assertEquals(expect[i], Demo.get_host_name(i + 1)); } }
解答:google
public final class Demo { private static List<String> nameList=new LinkedList<String>(); /***************************************************************************** Description : 添加主機名 Input Param : host_name 主機名字符串,非空串 Output Param : 無 Return Value : 成功返回0,失敗返回-1 *****************************************************************************/ public static int add_host_name( String host_name) { if(host_name!=null && !"".equals(host_name)){ int i=nameList.size()/2; int min=0; int max=nameList.size(); String[] inserts=host_name.split("[.]"); out: while(true){ if(i==max){ break out; } String[] befores=nameList.get(i).split("[.]"); int x=0; char[] beforechars=null; char[] insertchars=null; //將分隔後的String挨個字符比較,若當前String包含字符前一部分全相同則比較長度,不然繼續循環 while(x<Math.min(befores.length, inserts.length)){ String before=befores[befores.length-1-x]; String insert=inserts[inserts.length-1-x]; beforechars=before.toCharArray(); insertchars=insert.toCharArray(); for(int y=0;y<Math.min(beforechars.length, insertchars.length);y++){ if(beforechars[y]==insertchars[y]){ continue; }else if(beforechars[y]>insertchars[y]){ max=i; i=(i+1+min)/2; continue out; }else if(beforechars[y]<insertchars[y]){ min=i; i=(i+1+max)/2; continue out; } } if(beforechars.length>insertchars.length){ max=i; i=(i+1+min)/2; continue out; }else if(beforechars.length<insertchars.length){ min=i; i=(i+1+max)/2; continue out; } x++; } if(befores.length>inserts.length){ max=i; i=(i+1+min)/2; continue out; }else if(befores.length<inserts.length){ min=i; i=(i+1+max)/2; continue out; } } nameList.add(i,host_name); return 0; } return -1; } /***************************************************************************** Description : 獲取主機名 Input Param : serial_number 排序後的序列號,從1開始 Return Value : 主機名字符串 *****************************************************************************/ public static String get_host_name(int serial_number) { /* 在這裏實現功能 */ if(nameList!=null && nameList.size()>=serial_number){ return nameList.get(serial_number-1); } return null; } /***************************************************************************** Description : 清空全部主機名 Input Param : 無 Output Param : 無 Return Value : 無 *****************************************************************************/ public static void clear() { nameList=new LinkedList<String>(); /* 在這裏實現功能 */ }