輸入描述:
輸入一個字符串。
輸出描述:
輸出字符串中最長的數字字符串和它的長度。
輸入例子:
abcd12345ed125ss123058789,如果有重復的最大長度的數字串,則一起輸出,如1456jk4789,輸出14564789,4
輸出例子:
123058789,9
思路:先把字符串中的數字串取出來,然后取出長度最大的數字字串並輸出,剛開始我使用HashMap的key存儲數字字串,value存字串長度,考慮到HashMap存儲無序,故改為LInkedHashMap,然后根據Map的value值排序,取出value值最大的map元素並輸出,但是忽略一個特殊情況,就是當最大子串有若干個且相同,則map由於key不能重復,只會存儲一個,故有缺陷,但是卻被AC,后來使用list來存儲,解決了此問題並被AC,
先上有缺陷代碼:
1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.util.Comparator; 4 import java.util.Iterator; 5 import java.util.LinkedHashMap; 6 import java.util.List; 7 import java.util.Map; 8 import java.util.Map.Entry; 9 import java.util.Scanner; 10 import java.util.Set; 11 12 public class Test10 { 13 14 public static void main(String[] args) { 15 Scanner sc = new Scanner(System.in); 16 while (sc.hasNext()) { 17 String s = sc.next(); 18 Map<String,Integer> mp = new LinkedHashMap<String,Integer>();//使用Linked哈希保證元素的有序性 19 String s1 = s.replaceAll("[a-z]", " ");//把字符串中的字母全部替換為空格 20 String[] str = s1.split(" ");//以空格分割字符串 21 for (int i = 0; i < str.length; i++) {//把字符串中連續的數字串存至map中,其中key為數字串,value為數字串長度 22 if (str[i].length() != 0) {//由於有連續空格,使用空格分割時會出現多個空子串,空子串不予考慮,故有此判斷 23 if (str[i].charAt(0) != ' ') { 24 mp.put(str[i], str[i].length()); 25 } 26 } 27 } 28 //System.out.println(mp); 29 //System.out.println("-------"); 30 31 List<Map.Entry<String, Integer>> li = new ArrayList<Map.Entry<String,Integer>>();//用來存儲Map.Entry<String, Integer>類型 32 Set<Entry<String, Integer>>se = mp.entrySet();//獲得map的Map.Entry<String, Integer>類型 33 Iterator<Entry<String, Integer>> it = se.iterator(); 34 while(it.hasNext()){//把Map.Entry<String, Integer>類型元素存入list中,以便排序 35 Entry<String, Integer> en = it.next(); 36 li.add(en); 37 //System.out.println(en); 38 } 39 //System.out.println("-------"); 40 Collections.sort(li, new Comparator<Entry<String, Integer>>() {//使用Collections集合工具類對list中Entry類型元素按照value進行自然升序排序 41 42 @Override 43 public int compare(Entry<String, Integer> o1, 44 Entry<String, Integer> o2) { 45 // TODO Auto-generated method stub 46 return o1.getValue().compareTo(o2.getValue()); 47 } 48 }); 49 50 //Iterator<Entry<String, Integer>> it1 = se.iterator(); 51 //while(it1.hasNext()){ 52 //System.out.println(it1.next()); 53 // } 54 //System.out.println("-------"); 55 56 57 StringBuffer sb = new StringBuffer();//用來存儲長度最大且相等的數字串 58 for(int i=0;i<li.size();i++){ 59 if(li.get(li.size()-1).getValue()==li.get(i).getValue()){ 60 sb.append(String.valueOf(li.get(i).getKey())); 61 } 62 } 63 System.out.println(sb+","+li.get(li.size()-1).getValue()); 64 } 65 } 66 }
上面代碼如果輸入時1234hj1234,則不會輸出正確結果12341234,4 ,會輸出1234,4,下面使用list
1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.util.Comparator; 4 import java.util.List; 5 import java.util.Scanner; 6 7 public class Test11 { 8 9 public static void main(String[] args) { 10 Scanner sc = new Scanner(System.in); 11 while (sc.hasNext()) { 12 String s = sc.next(); 13 List<String> li = new ArrayList<String>(); 14 String s1 = s.replaceAll("[a-z]", " ");// 把字符串中的字母全部替換為空格 15 String[] str = s1.split(" ");// 以空格分割字符串 16 for (int i = 0; i < str.length; i++) {// 把字符串中連續的數字串存至map中,其中key為數字串,value為數字串長度 17 if (str[i].length() != 0) {// 由於有連續空格,使用空格分割時會出現多個空子串,空子串不予考慮,故有此判斷 18 if (str[i].charAt(0) != ' ') { 19 li.add(str[i]); 20 } 21 } 22 } 23 24 Collections.sort(li, new Comparator<String>() { 25 26 @Override 27 public int compare(String o1, String o2) {//這里根據list中的字符串元素長度大小進行自然排序 28 // TODO Auto-generated method stub 29 return Integer.valueOf(o1.length()).compareTo( 30 Integer.valueOf(o2.length())); 31 } 32 }); 33 StringBuffer sb = new StringBuffer();//用來存儲長度最大且相等的數字串 34 for (int i = 0; i < li.size(); i++) { 35 if (li.get(i).length() == li.get(li.size() - 1).length()) { 36 sb.append(li.get(i)); 37 } 38 } 39 40 System.out.println(sb + "," + li.get(li.size() - 1).length()); 41 } 42 } 43 }