例题1: 56. 合并区间
class Solution { public int[][] merge(int[][] intervals) { //先根据第一个数字从小到大排序 //判断第一个区间的右边界和第二个的左边界大小关系 //大于的话就取前左右后,合并 //小于就把两个区间都放到新的二维数组里 //生成的区间再和下一个进行同样的操作 if(intervals.length==0 || intervals[0].length==0) return intervals; Arrays.sort(intervals,(v1,v2)-> v1[0]-v2[0]); int[][] result=new int[intervals.length][2]; int index=0; result[index][0]=intervals[0][0]; result[index][1]=intervals[0][1]; for(int i=1;i<intervals.length;i++){ if(result[index][1]>=intervals[i][0]){ result[index][1]=Math.max(result[index][1],intervals[i][1]); }else{ index++; result[index][0]=intervals[i][0]; result[index][1]=intervals[i][1]; } } return Arrays.copyOf(result,index+1); } }
执行用时:8 ms, 在所有 Java 提交中击败了62.89%的用户
内存消耗:42.5 MB, 在所有 Java 提交中击败了35.65%的用户
例题2:面试题 05.01. 插入
class Solution { public int insertBits(int N, int M, int i, int j) { int mask=((1<<(j-i+1))-1)<<i; mask=~mask; N&=mask; M=M<<i; return M|N; }}
这题可以用位运算,注意位运算的左移右移和取反。