题目介绍:
定义线段:
//线段,表示起点和终点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向后平移 } } } }}