題目:
金融證券行業超好的薪酬待遇,吸引了大批的求職者前往應聘,小東也不例外,準備應聘一家證券公司。面試官為考察她的數據分析、處理和編碼能力,為她準備了以下問題。
股票交易中,委托是指股票交易者在證券公司買賣股票。每手委托包括一個委托單號i、價格pi、買入或賣出標記di及交易數量qi。
交易處理中,需要把同類業務(買入或賣出)中相同價格的所有委托合并起來,形成一個清單。清單的第一部分為按價格降序排列的合并后的賣出委托,緊隨其后的是按相同順序排列的買入合并委托。證券公司比較關心的是比較搶手的s條合并委托信息,需要得到買入及賣出最搶手的s條合并委托。對于買入委托,搶手的是指報價高的委托,而賣出委托中報價低的較為搶手。若買或賣的合并委托數小于s條,則全部列入清單中。
現在小東拿到的是n個委托,請你幫忙找出最搶手的s個合并委托。
輸入
輸入有若干組,每組的第一行為兩個正整數n和s(1<=n<=1000,1<=s<=50),分別表示委托數和最搶手的清單數,接下來的n行為具體的委托信息,每行包含3部分,第一部分為一個字母‘B’或‘S’,表示買入或賣出,后兩部分為兩個整數p和q,表示報價和數量。任何賣出委托的報價都比買入委托的報價高。
樣例輸入:
6 2
B 10 3
S 50 2
S 40 1
S 50 6
B 20 4
B 25 10
輸出
輸出不超過2s行合并委托清單,格式與輸入相同。
樣例輸出
S 50 8
S 40 1
B 25 10
B 20 4
這道題看的時候頭都大了,其實方法就是提取關鍵字,雖然寫了很多但是最重要的是理解輸出想要啥,無論用什么手段只要能達到最后結果就OK。這是AC的基本目的。
關鍵1:
這題要求我們從字母B和S區分:
B表示買入
S表示賣出
關鍵2:
要求將p合并,如果有重復的p,則使其q值疊加起來。這里是不是已經想到用Map了???
關鍵3:
輸入的s表示,輸出的清單數量,如果s比我們算出的清單大,則把清單全輸出即可。
好了,這里關鍵點說完了,我的腦洞一向都比較大,這里我抓住Entry就不放手了,因為把這個當做了突破口,最后真的一次就搞出來了,具體在代碼里體現,其實做了很多麻煩的重復的操作,不過輸出正確就OK,優化的事情以后慢慢做就好:直接粘代碼了!
import java.util.*;
/**
* Created by AceCream on 2017/4/1.
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int n = sc.nextInt();
int s = sc.nextInt();
Map<Integer, Integer> mapB = new TreeMap<>();
Map<Integer, Integer> mapS = new TreeMap<>();
for (int i = 0 ;i < n; i++){
String choose = sc.next();
int price = sc.nextInt();
int count = sc.nextInt();
if (choose.equals("B")) {
if (mapB.containsKey(price)) {
mapB.put(price, count + mapB.get(price));
} else {
mapB.put(price, count);
}
} else {
if (mapS.containsKey(price)) {
mapS.put(price, count + mapS.get(price));
} else {
mapS.put(price, count);
}
}
}
//這之前的代碼也沒什么難的,去掉重復的,然后更新Map的value值罷了
Set<Map.Entry<Integer, Integer>> entrySetB = mapB.entrySet();
Set<Map.Entry<Integer, Integer>> entrySetS = mapS.entrySet();
//后面主要是玩這兩個List
List<Integer> listB = new ArrayList<>();
List<Integer> listS = new ArrayList<>();
for (Map.Entry entryB : entrySetB) {
listB.add((Integer) entryB.getKey());
}
Collections.sort(listB);
Collections.reverse(listB);
if (listB.size()>s){
listB = listB.subList(0,s);
}
for (Map.Entry entryS : entrySetS) {
listS.add((Integer) entryS.getKey());
}
Collections.sort(listS);
if (listS.size()>s){
listS = listS.subList(0,s);
}
Collections.reverse(listS);
for (int i : listS) {
System.out.println("S "+i+" "+mapS.get(i));
}
for (int i : listB) {
System.out.println("B "+i+" "+mapB.get(i));
}
}
}
}