题目来源:《编程之美》2.19——区间重合判断
/**
* 查找对于一组无序区间(比如{1,3},{4,5}),某给定的源区间是否被该范围覆盖。(在数轴上覆盖)
* 例如:{1,2},{2,3}是否覆盖{1,3}?答案为真。
* @author DevUser
*
*/
public class NumCover {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String dataIn = "1,4,5,8 1,8";//构造输入:范围为:{1,4},{5,8},给定数值:{1,8}
String pairIn = dataIn.split(" ")[0];
String checkIn = dataIn.split(" " )[1];
System.out.println(cover(splitInput(pairIn),checkIn));
}
/**
* 将输入范围改造成二维数组
* @param in
* @return
*/
public static int[][] splitInput(String in){
String[] spltPair = in.split(",");
int[][] rs = new int[spltPair.length/2][];
int i = 0;
for(;i < spltPair.length; i += 2){
int[] coveri = new int[2];
coveri[0]=Integer.parseInt(spltPair[i]);
coveri[1]=Integer.parseInt(spltPair[i+1]);
rs[i/2]=coveri;
}
return rs;
}
/**
* 检查是否全覆盖 即check参数内的真包含的每个数均在range内。穷举check包含的每个数
* @param range
* @param check
* @return
*/
public static boolean cover(int[][] range, String check){
String[] ck = check.split(",");
int[] cka = new int[2];
for(int i = 0 ; i < ck.length; i++){
cka[i] = Integer.parseInt(ck[i]);
}
Set<Integer> rangeSt = new HashSet<Integer>();
for(int[] ar : range){
for(int i = ar[0]; i< ar[1];i++){
rangeSt.add(i);
}
}
for(int i = cka[0];i<cka[1];i++){
if(!rangeSt.contains(i)){
return false;
}
}
return true;
}
}