题目介绍:
定义线段:
//线段,表示起点和终点
public class Segment {
int start;
int end;
public Segment(int start,int end)
{
this.start=start;
this.end=end;
}
}
题目:
//假设两个list有序,且线段不相交,即后一个segment的start大于前一个segment的end。p判断前一个list是否包含后一个list
List<Segment> l1=new ArrayList<Segment>();
List<Segment> l2=new ArrayList<Segment>();
代码:
import java.util.ArrayList;
import java.util.List;
public class SegmentDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//假设两个list有序,且线段不相交,即后一个segment的start大于前一个segment的end。p判断前一个list是否包含后一个list
List<Segment> l1=new ArrayList<Segment>();
List<Segment> l2=new ArrayList<Segment>();
l1.add(new Segment(1, 3));
l1.add(new Segment(5, 10));
l2.add(new Segment(5, 6));
l2.add(new Segment(7, 11));
SegmentContain seContain=new SegmentContain();
if(seContain.segcontains(l1, l2))
System.out.println("true");
else
System.out.println("false");
}
}
import java.util.List;
import javax.imageio.stream.IIOByteBuffer;
public class SegmentContain {
public boolean segcontains(List<Segment> l1,List<Segment> l2)
{
int i=0;
int j=0;
int leng1=l1.size();
int leng2=l2.size();
int number=0;
for(;i<leng1 && j<leng2;)
{
int value=isequal(l1.get(i),l2.get(j));
if(value==0)
{j++;number++;}
else if (value<0)
{
i++;
}
else {
j++;
number++;
}
}
if(number==leng2)
return true;
else {
return false;
}
}
private int isequal(Segment s1,Segment s2)
{
if(s1.start>s2.start)
{
return -1;
}
else {
if(s1.start==s2.start)
{
if(s1.end==s2.end) //线段相等,返回0,i,j均相加
return 0;
else if (s1.end<s2.end) //
{
return -1;
}
else
{
return 0;
}
}
else {
if(s1.end==s2.end)
return 0;
else if (s1.end<s2.end)
{
return -1;
}
else {
return 1; //线段包含,返回1,表示list2向后平移
}
}
}
}
}