题目描述:酒店价格
酒店房间的价格录入是通过时间段来录入的,比如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.相邻两天的价格如果相同,那么这两个日期段应该合并
2.合并的结果应该以起始日期从小到大排序
输入描述: 输入数据包括多行,如样例输入所示。
输出描述:输出数据为一行,如样例输出所示
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%