0819微软笔试
problem 1 :
给定X[],Y[],组成坑洞坐标,现有填坑机,机器填坑宽度是W,沿y轴平行方向填坑,问最少几台机器可以填补所有的坑?
method: 按照X坐标贪心遍历。
problem 2 :
给定字符串S,求S中某些字符组成的最大回文字符串。
eg: "19878" ---"898"
method: 找所有出现偶数次的数字和一个最大的奇数次的数字,偶数次数字排序,由大到小拼接成字符串,中间加上奇数次的一个数字组成回文字符串。
or dfs求所有子集,遍历得到最大的回文字符串。
problem 3:
给定一些房子和办公楼,两点间有一个路线,无环,每个房子楼下都有一辆车,车最多坐5个人,两点间消耗1L油,问,所有房子里的人到达办公楼所需的最小油。
method: 图的bfs遍历,两点间油消耗随此房间当时的人数而变即可。
import java.util.Arrays; import java.util.LinkedList; public class Main20 { public static void main(String[] args) { int[] A = new int[]{1,1,1,9,9,9,9,7,8}; int[] B = new int[]{2,0,3,1,6,5,4,0,0}; int res = solution(A, B); System.out.println(res); } public static int solution(int[] A, int[] B) { // write your code in Java 8 (Java SE 8) //建造入度与邻接矩阵 int[] inDegree = new int[A.length + 1]; int[][] matrix = new int[A.length + 1][A.length + 1]; for(int i = 0; i < A.length; i++){ matrix[A[i]][B[i]]++; matrix[B[i]][A[i]]++; inDegree[A[i]]++; inDegree[B[i]]++; } int[] val = new int[A.length + 1]; //每个节点的初始人数 Arrays.fill(val, 1); LinkedList<Integer> queue = new LinkedList(); for(int i = 1; i < inDegree.length; i++){ if(inDegree[i] == 1){ //即入度为1且不是办公区0的房子入队 queue.add(i); } } int res = 0; while(!queue.isEmpty()){ int len = queue.size(); for(int i = 0; i < len ; i++){ int tmp = queue.remove(); //将此房子的人移到另一个房子内即可 //计算移动当前房间人所需的油 if(val[tmp] % 5 == 0){ res += val[tmp] / 5; }else{ res += val[tmp] / 5 + 1; } //找到其下一个房子是哪个 for(int j = 0; j < inDegree.length; j++){ if(matrix[tmp][j] == 1){ matrix[tmp][j]--; matrix[j][tmp]--; inDegree[j]--; inDegree[tmp]--; //非办公区的房子且入度为1,入队 if(j != 0 && inDegree[j] == 1){ queue.add(j); } //人数要加上之前的人 val[j] += val[tmp]; } } } } return res; } }