(京东在线笔试编程题)关于证券委托的一道题

题目的详细信息已经记不住,只能大致描述一下,就是求最有价值的的委托信息。

n、s、B、S

其中n代表委托信息,s要求的最有价值的委托信息的个数,B代表买入、S代表卖出,S条卖出按照从小到大,买入按照从大到小。

输出:

6 2

B 50 2 

S 50 1 

S 20 2 

S 30 1 

B 40 4 

B 50 6 

输出:

B 50 8

B 40 4

S 20 2

S 30 1

(备注:6代表委托信息的个数、2代表表示买入和卖出委托信息各返回2个 ,其中每行如“B 50 2",第一个字段B代表买入,S代表卖出,50代表价格,最后一个字段代表数量)

思路:排序,合并同类型,然后输出。

import java.util.*;
public class Main {

	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		while(sc.hasNextInt()){
			int N=sc.nextInt();
			int M=sc.nextInt();
			List<TS> list1=new ArrayList<TS>();
			List<TB> list2=new ArrayList<TB>();
			for(int index=0;index<N;index++){
				String type=sc.next();
				int price=sc.nextInt();
				int num=sc.nextInt();
				if(type.equals("S")){
					TS t=new TS(type,price,num);
				list1.add(t);
				}else{
					TB t=new TB(type,price,num);
					list2.add(t);
				}
			}
			List<TS> listrs=new ArrayList<TS>();
			List<TB> listrb=new ArrayList<TB>();
				Collections.sort(list1);// 排序
				if(list1.size()>0){//合并相同类型
				listrs.add(list1.get(0));
				int count=0;
				for(int i=1;i<list1.size();i++){
					if(list1.get(i).price==list1.get(i-1).price){
						listrs.get(count).num+=list1.get(i).num;
					}else{
						listrs.add(list1.get(i));
						count++;
					}
				}
				}
				Collections.sort(list2);//如上操作
				if(list2.size()>0){
					listrb.add(list2.get(0));
					int count=0;
					for(int i=1;i<list1.size();i++){
						if(list2.get(i).price==list2.get(i-1).price){
							listrb.get(count).num+=list2.get(i).num;
						}else{
							listrb.add(list2.get(i));
							count++;
						}
					}
					}
				if(listrs.size()<M){
					for(int i=0;i<listrs.size();i++){
						System.out.print(listrs.get(i).type+" "+listrs.get(i).price+" "+listrs.get(i).num);
						System.out.println();
					}
				}else{
					for(int i=0;i<M;i++){
						System.out.print(listrs.get(i).type+" "+listrs.get(i).price+" "+listrs.get(i).num);
						System.out.println();
					}
				}
				if(listrb.size()<M){
					for(int i=0;i<listrb.size();i++){
						System.out.print(listrb.get(i).type+" "+listrb.get(i).price+" "+listrb.get(i).num);
						System.out.println();
					}
				}else{
					for(int i=0;i<M;i++){
						System.out.print(listrb.get(i).type+" "+listrb.get(i).price+" "+listrb.get(i).num);
						System.out.println();
					}
				}
		}

	}

}
class TB implements Comparable<TB>{
	String type;
	int price;
	int num;
	public TB(String t,int p,int n){
		this.type=t;
		this.price=p;
		this.num=n;
	}
	public int compareTo(TB t){
		if(this.price>t.price){
			return -1;
		}else if(this.price<t.price){
			return 1;
		}else{
			return 0;
		}
	}
}
class TS implements Comparable<TS>{
	String type;
	int price;
	int num;
	public TS(String t,int p,int n){
		this.type=t;
		this.price=p;
		this.num=n;
	}
	public int compareTo(TS t){
		if(this.price>t.price){
			return 1;
		}else if(this.price<t.price){
			return -1;
		}else{
			return 0;
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值