牛客训练集

题目描述:酒店价格

酒店房间的价格录入是通过时间段来录入的,比如10月1日至10月7日800元,10月8日至10月20日500元,请实现以下函数int[][] merge(int[][] dateRangePrices),输入是某个酒店多个日期段的价格每个日期段(终止日期大于等于起始日期)和对应的价格使用长度为3的数组来表示,比如[0, 19, 300], [10, 40, 250]分别表示从某天开始第1天到第20天价格都是300,第11天到第41天价格都是250,这些日期端有可能重复,重复的日期的价格以后面的为准, 请以以下规则合并并输出合并结果:
1.相邻两天的价格如果相同,那么这两个日期段应该合并
2.合并的结果应该以起始日期从小到大排序
 
  

输入描述: 输入数据包括多行,如样例输入所示。

输出描述:输出数据为一行,如样例输出所示

输入   1 1 100                            输出:[1, 3, 100],[4,5,110]
      2 3 100
      4 5 110
import java.util.List;
import java.util.Scanner;
import java.util.ArrayList;
/** 
 6  *  酒店价格
 7  *    把每天的价格 都放进一个数组里
 8  *    遍历
 9  * @author Dell
11  */
public class Main{
    public  static void main(String[] args) {
	        Scanner sc= new  Scanner(System.in);
	        // List<int[]> list=new ArrayList();
	       List<int []> list=new ArrayList<>();
	        while(sc.hasNextInt()){ //   按  Ctrl + z 结束输入
	           int[] p = new int[3]; 
	             p[0]= sc.nextInt();//第一行
	            p[1]= sc.nextInt();//第二个数
	           p[2]= sc.nextInt();//第三数
	            list.add(p);//
	        }
	        int[][] price=new int [list.size()][3];//行列
	        //  将list里的数组转化进price toArray() 会得到object[]会导致转型失败 toArray(price) 里使用泛型可以转型
	         price=list.toArray(price);
	           int res[][] =merge(price);
	        // int[][] {{1,1,100},{2,3,100},{4,5,110}}=new int [list.size()][3];
	         
	        // int res[][] = merge(new int[][] {{1,1,100},{2,3,100},{4,5,110}});
	   String string="";
	        for(int i=0;i<res.length;i++)//输出每个行
	     {
	    
	         string+="["+res[i][0]+", "+res[i][1]+", "+res[i][2]+"],";  
	     }
	         string = string.substring(0,string.length()-1);
	         System.out.println(string);
	         sc.close();
	    }
	     
	    static public int[][] merge(int[][] dateRangePrices)
	     {
	        int maxday=Integer.MIN_VALUE;
	            int minday=Integer.MAX_VALUE;
	         for(int i=0;i<dateRangePrices.length;i++)
	         {
	             if(dateRangePrices[i][1]>maxday)
	             {
	                 maxday=dateRangePrices[i][1];//获取最大天数
	             }
	             if(dateRangePrices[i][0]<minday)
	             {
	                  minday=dateRangePrices[i][0];//获取最小天数
	             }
	         }
	         //构造各天价格数组
	         int []dayPrice=new int [maxday+1];//把第三列的价格给dayprice int res[][] =merge(price);
	        for(int j=0;j<dateRangePrices.length;j++){//三行代码
	            for(int i=dateRangePrices[j][0];i<=dateRangePrices[j][1];i++)
	        {dayPrice[i] =dateRangePrices[j][2];}}//把所有的从小到大的价格一个个给他们
	        
	        //装入第一天  minday
	         int endDay=minday;
	          int startDay=minday;
	         int curprice=dayPrice[minday];
	         List<int[]> l=new ArrayList<>();
	         //从第二填循环
	         for(int j=minday+1;j<dayPrice.length;j++)
	         {
	          // if(dayPrice[j]==0){continue;}
	             
	             if(dayPrice[j]==curprice)//找到合并两个日期,合并的结果由小到大排序
	            {
	                endDay++;
	            }else{
	                l.add(new int[]{startDay,endDay,curprice});
	                   startDay =j;
	                    endDay =j;
	                    curprice =dayPrice[j];
	            }
	         }   
	        //跳出循环
	         endDay=maxday;
	         l.add(new int[]{startDay,endDay,curprice}); 
	             //输出数组;
	            int res[][]=new int [l.size()][3];
	          for(int i=0;i<res.length;i++)
	          {
	              res[i]=l.get(i);
	          }
	          return res;   
	           
	     }
	   
}通过为AC  90%


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值