2019阿里巴巴实习生客户端开发工程师Android编程题脏矩阵合并

记录一下今晚参加的2019阿里Android开发实习生一道编程题。
另一道连题目都没看懂,还浪费了好多时间qaq
这一道看懂题目后其实也不是很难吧,当时没时间了,匆忙中也弄错了一些细节,哎,早知道这么难就不参加了,何必呢…
话不多说上题目

题目:脏矩阵合并

为了记录这个题,截了好多张图,不要不信,看题目能把人吓一跳。看了半天都不知道这是个啥鬼题。

各位小伙伴你们体会一下吧~~~

图一
2019阿里巴巴实习生客户端开发工程师Android编程题脏矩阵合并_第1张图片

图二
2019阿里巴巴实习生客户端开发工程师Android编程题脏矩阵合并_第2张图片
图三
2019阿里巴巴实习生客户端开发工程师Android编程题脏矩阵合并_第3张图片
图四
2019阿里巴巴实习生客户端开发工程师Android编程题脏矩阵合并_第4张图片
图五
2019阿里巴巴实习生客户端开发工程师Android编程题脏矩阵合并_第5张图片
图六
2019阿里巴巴实习生客户端开发工程师Android编程题脏矩阵合并_第6张图片

图七
2019阿里巴巴实习生客户端开发工程师Android编程题脏矩阵合并_第7张图片

思路

怎么样?光看懂题目得半天吧,这还不保证能不能看懂QAQ

我理解的题意,一句话概括就是:矩阵合并,然后再计算面积

那个单次渲染时间,就是一个的矩形面积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(b2b1 && right2right1 || 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.leftright2?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 rec = new ArrayList<>();//暂存列表
        List realRec = new ArrayList<>();//真正合并后的矩形
        rec.add(rects[0]);//先添加一个
        for(int i = 1;i

也不知道对不对。。。
反正它给的那个用例测了下,结果是对的。

哎,做的不好…
2019阿里巴巴实习生客户端开发工程师Android编程题脏矩阵合并_第8张图片

你可能感兴趣的:(传统算法)