[刷題]交易清單(京東2016實習生真題)

題目:

金融證券行業超好的薪酬待遇,吸引了大批的求職者前往應聘,小東也不例外,準備應聘一家證券公司。面試官為考察她的數據分析、處理和編碼能力,為她準備了以下問題。
股票交易中,委托是指股票交易者在證券公司買賣股票。每手委托包括一個委托單號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));
            }
        }
    }
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 中華人民共和國證券法 (1998年12月29日第九屆全國人民代表大會常務委員會第六次會議通過 根據2004年8月2...
    那只貓煜閱讀 867評論 0 8
  • 美豹金融的美股大學--https://www.usmeibao.com/knowledge.html 一、基礎篇 ...
    格式化_001閱讀 2,615評論 1 5
  • 為什么世界總不聽話 人們總是希望這個世界按照自己的意愿運轉,希望身邊的任何人都聽從自己的安排。事實上你會發現,讓別...
    靜888閱讀 12,408評論 1 45
  • 棧內存: 存放變量(基本數據類型)以及引用(引用數據類型),當方法調用完成后,變量以及引用會被銷毀變量中直接存放值...
    WhiteSpace123閱讀 251評論 0 0
  • 大家好,我是圈圈,相信大家都已經看到地震的新聞了 據中國地震臺網測定:昨晚在四川阿壩州九寨溝縣發生7.0級地震 截...
    小聲講故事閱讀 454評論 0 0