網易2019客戶端開發實習生崗位線上筆試第一題
其實就是個數數的功能,給你一個輸入文本,讓你統計其中各單詞出現次數,從大到小排,次數相同的按照單詞ASCII表排:
輸入規則:
第一行會是行數N ( 0 < N <= 500),之後N行中的每行第一個字段是數字X (0 <= X <= 500),表示該行後面有X個單詞。數字與單詞間,單詞與單詞間均以空格分隔。N行後會有一行,包含數字K ( 0 < K <= N),數據總大小不超過100K。
輸入樣例:
3
3 SQL DW AND
1 AND
3 SQL SQL DW
2
輸出示例:
SQL 3
AND 2
DW 2
我的思路:
1、用雙列集合HashMap存儲單詞和次數
2、用雙列集合TreeMap構建比較器來取消重複限制,並按次數排序
3、將HashMap鍵值存入TreeMap的值和鍵中,進行反轉
4、此時映射關係已經基本完成,還差一步同次數按碼錶排序沒時間了。
哭死,當時用HashMap的get()方法來獲取鍵結果一直是null但是後面的次數確是對的。。。迷。。。
我提交的結果是:
null 3
null 2
null 2
醉了啊,系統自動提交了結果匹配率0。可以GG了。
後來我改成EntrySet來獲取鍵值對遍歷,就可以了。。。cao。。。
最後那個重複次數排序的思路大概是這樣:遍歷到重複的時候把重複的單獨抽出來構成TreeSet,鍵爲單詞,值爲次數,String類自帶比較,不用自己寫。思想比較笨我也想不到其他的。。。就i這樣吧,OVER
附上我的代碼:
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.Comparator;
public class Test01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
HashMap<String, Integer> hm=new HashMap<>();
int lineNum = sc.nextInt();
for(int i = 0; i < lineNum; i++){
int wordNum=sc.nextInt();
for(int j = 0; j < wordNum; j++){
String s=sc.next();
if(!hm.containsKey(s)) {
hm.put(s,1);
}else {
hm.put(s, hm.get(s)+1);
}
}
}
int x=sc.nextInt();
TreeMap<String, String> tm=new TreeMap<>(new Comparator<String>() {
@Override
public int compare(String arg0, String arg1) {
// TODO Auto-generated method stub
int num=Integer.parseInt(arg1)-Integer.parseInt(arg0);
return num==0?1:num;
}});
for(String s:hm.keySet()) {
tm.put(hm.get(s).toString(), s);
}
for(Entry<String, String> e:tm.entrySet()) {
System.out.println(e.getValue()+" "+e.getKey());
}
//System.out.println(tm);
}
}
我會告訴你們其實另外兩題編程題我都不會麼。。。。~__~