注:此题来源于CSDN论坛,解法也是来源于论坛上的讨论,非原创,特此声明
题目: 有两个数组a{1,5,8,10,14,15,17,18,20,22,24,25,28}和b{2,4,6,8,10,12},
如何求出他们之间的交集?要求效率越高越好,数组都是从小到大排序好的。
此题解法的详细说明可以参考侯捷的《STL源码剖析》书中第333页。此解法与论坛上说给
出的解法相同。
C++代码实现:
- #include <stdio.h>
- void Set_Intersection(int* a, int lenA, int *b,int lenB)
- {
- int i = 0;
- int j = 0;
- while(i < lenA && j < lenB)
- {
- if(*(a+i) < *(b+j))
- ++i;
- else if(*(a+i) > *(b+j))
- ++j;
- else
- {
- printf("%d ", *(a+i));
- ++i;
- ++j;
- }
- }
- }
- int main()
- {
- int a[] = {1,3,5,7,9,11};
- int b[] = {1,1,2,3,5,8,13};
- int lenA = sizeof(a)/sizeof(int);
- int lenB = sizeof(b)/sizeof(int);
- Set_Intersection(a,lenA,b,lenB);
- return 0;
- }
PHP代码
<?php
//获取2个 排序后 的数组交集
//注意 是排序后
$a = array(1,2,3,4,5);
$b = array(2,3,5,6,7);
function gwyy(&$a,&$b) {
$i = $j = 0;
while($i < count($a) && $j < count($b) ) {
if($a[$i] < $b[$j]) {
++$i;
} else if ($a[$i] > $b[$j]) {
++$j;
} else {
echo '交集'.$a[$i].'<br />';
++$i;
++$j;
}
}
}
gwyy($a,$b);