[C趣味编程]三个有序的数组,求所有公共的元素

 

 

public class YouXuShuzu_QiuGongGongYuansu {

    public static void main(String[] args) {
        int[] queue1 = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,19,22};//18个元素
        int[] queue2 = {1,5,7,8,9,10,12,13,15,19,22};//11个元素
        int[] queue3 = {1,5,7,8,11,13,19,20,22};//9个元素
        commonOnes(queue1,queue2,queue3);
    }
    
    /**
     * 3个有序的数组(从小到大),求在3个数组中都存在的公共元素<br>
     * 思想是:<br>
     * (1)使用3个指针,在3个数组上从左向右遍历。3个指针初始化时均在第一个元素上。<br>
     * (2)比较指针指向的3个数,判断是否相等,<br>
     *      如果3个数相等,则输出,且3个指针向右移动一步;<br>
     *      如果3个数不全相等,则找出最大值N。比较小的数所在的2个数组,2个指针分别向右移动,直到找到>=N的数或数组尽头,指针停止移动。<br>
     *    如果某个数组到了尽头且未找到>=N的数,则程序结束。<br>
     *    否则,继续执行(2).<br>
     */
    public static void commonOnes(int[] queue1,int[] queue2,int[] queue3){
        int i=0,j=0,k=0;
        int count=0;//循环次数
        int pointCount=0;//指针移到次数,应该是O(n)
        while(i<queue1.length && j<queue2.length && k<queue3.length){
            if( queue1[i] == queue2[j] && queue1[i] == queue3[k]){
            //如果3个数相等,则输出,且3个指针向右移动一步;
                System.out.print(queue1[i]+" ");
                i++;j++;k++;pointCount+=3;
            }else if(i==queue1.length-1 && j==queue2.length-1 && k==queue3.length-1){
            //如果某个数组到了尽头且未找到>=N的数,则程序结束
                return;
            }else{
            //如果3个数不全相等,则找出最大值N。比较小的数所在的2个数组,2个指针分别向右移动,直到找到>=N的数或数组尽头,指针停止移动。
                int maxNum = max(queue1[i],queue2[j],queue3[k]);
                while(queue1[i]<maxNum && i<queue1.length-1){i++;pointCount++;}
                while(queue2[j]<maxNum && j<queue2.length-1){j++;pointCount++;}
                while(queue3[k]<maxNum && k<queue3.length-1){k++;pointCount++;}
            }
            count++;
        }
        System.out.print("\n循环次数:"+count);
        System.out.print("\n指针移到次数(最大情况是等于3个数组的总长度):"+pointCount);
    }

    private static int max(int a, int b, int c) {
        int temp = a<b ? b:a;
        return temp<c ? c:temp;
    }

}
 

 

效果:

1 5 7 8 13 19 22
循环次数:14
指针移到次数(最大情况是等于3个数组的总长度):38

 

 

---EOF---

你可能感兴趣的:(编程,C++,c,C#,J#)