2019アリババインターンクライアント開発エンジニアAndroidプログラミング問題ダーティマトリックス合併

今夜参加した2019アリババAndroid開発インターンのプログラミングの質問を記録します。
もう1人はタイトルすら理解できず、多くの時間を無駄にしました。
タイトルを理解した後、Qaqは実際にはそれほど難しくありませんでした。そのときは時間がなかったので、急いでミスをしました。ねえ、私とても難しいことを知っていて、私は参加しませんでした。では、なぜわざわざ...
トピックについて話すことはあまりありません

トピック:ダーティマトリックスのマージ

この質問を記録するために、私はたくさんの写真を切りました、それを信じないでください、それは質問を見ることによって人々を驚かせることができます。長い間見ていましたが、幽霊の質問が何なのかわかりません。

親愛なる友人、それを体験してください~~~

図1
図1

写真2
図II
写真3
図3
写真4
図4
写真5
図5
写真6
図6

図7
図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;
    }
}

それが正しいかどうかはわかりません。
とにかく、それが与えたユースケースはテストされ、結果は正しいものでした。

ねえ、よくできていません...
人生の苦難にうんざりしている

おすすめ

転載: blog.csdn.net/fxjzzyo/article/details/89264177