今夜参加した2019アリババAndroid開発インターンのプログラミングの質問を記録します。
もう1人はタイトルすら理解できず、多くの時間を無駄にしました。
タイトルを理解した後、Qaqは実際にはそれほど難しくありませんでした。そのときは時間がなかったので、急いでミスをしました。ねえ、私とても難しいことを知っていて、私は参加しませんでした。では、なぜわざわざ...
トピックについて話すことはあまりありません。
トピック:ダーティマトリックスのマージ
この質問を記録するために、私はたくさんの写真を切りました、それを信じないでください、それは質問を見ることによって人々を驚かせることができます。長い間見ていましたが、幽霊の質問が何なのかわかりません。
親愛なる友人、それを体験してください~~~
図1
写真2
写真3
写真4
写真5
写真6
図7
アイデア
どうですか?質問を理解するのに長い時間がかかります、これはあなたがQAQを理解できることを保証するものではありません
私が理解している質問の意味は1つの文に要約されています:マトリックスがマージされ、次に面積が計算されます。
単一のレンダリング時間は、長方形s + 10000の領域です。つまり、t = s + 10000の
合計レンダリング時間であり、すべてのマージされた長方形のレンダリング時間の合計です。
コード
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Testss {
private static class Rect {
private int left;
private int top;
private int width;
private int height;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = Integer.parseInt(in.nextLine());
Rect[] rects = new Rect[n];
for (int i = 0; i < n; i++) {
rects[i] = new Rect();
rects[i].left = Integer.parseInt(in.nextLine());
rects[i].top = Integer.parseInt(in.nextLine());
rects[i].width = Integer.parseInt(in.nextLine());
rects[i].height = Integer.parseInt(in.nextLine());
}
System.out.println(String.valueOf(costTime(rects)));
}
/**
* 两个矩形是否能合并
* @param r1
* @param r2
* @return
*/
public static boolean isMerge(Rect r1,Rect r2){
int right1 = r1.left+r1.width;//右
int b1 = r1.top+r1.height;//下
int right2 = r2.left+r2.width;//右
int b2 = r2.top+r2.height;//下
//一个矩阵在另一个矩阵的左上右下部分任何一个方位,就是没有交集,就是不能合并
if(b2<r1.top && right2<r1.left || r2.top>b1 && right2<r1.left
|| b2<r1.top && r2.left>right1 || r2.top>b1 && r2.left>right1
){
return false;
}
//否则有交集,能合并
return true;
}
/**
* 合并两个矩形
* @param r1
* @param r2
* @return
*/
public static Rect merge(Rect r1,Rect r2){
int right1 = r1.left+r1.width;
int b1 = r1.top+r1.height;
int right2 = r2.left+r2.width;
int b2 = r2.top+r2.height;
//合并成新的矩阵
Rect r = new Rect();
r.left = r1.left<r2.left?r1.left:r2.left;//左
r.top = r1.top<r2.top?r1.top:r2.top;//上
int right = right1>right2?right1:right2;//右
int b = b1>b2?b1:b2;//下
r.width = right-r.left;//宽
r.height = b-r.top;//高
return r;
}
private static long costTime(Rect[] rects) {
int len = rects.length;
if(len == 0) return 0;
List<Rect> rec = new ArrayList<>();//暂存列表
List<Rect> realRec = new ArrayList<>();//真正合并后的矩形
rec.add(rects[0]);//先添加一个
for(int i = 1;i<len;i++){
boolean isMerged = false;//标记是否合并了
//从暂存表中依次比较,看能否合并,
for(Rect re:rec){
boolean canM = isMerge(re,rects[i]);
if(canM){
//能删除当前的,并添加合并后的
rec.remove(re);
rec.add(merge(re,rects[i]));
isMerged = true;
break;
}
}
//如果出现一个不能合并的,就把暂存合并的矩形放到真正合并后的列表中
//开启一轮新的合并
if(!isMerged) {
//保存真正的合并后的矩形
realRec.addAll(rec);
//清空暂存列表
rec.clear();
//添加该不能合并的矩形,开启新的一轮合并
rec.add(rects[i]);
}
}
//添加最后一轮合并好的矩形
if(rec.size()!=0){
realRec.addAll(rec);
}
//计算最终面积,结果
int resu = 0;
for(Rect r: realRec){
resu+=r.width*r.height+10000;
}
return resu;
}
}
それが正しいかどうかはわかりません。。。
とにかく、それが与えたユースケースはテストされ、結果は正しいものでした。
ねえ、よくできていません...