//two_arg.cpp
//题目:两个有序数组,求是否有共同元素(假设是两个升序数组)。
//要求:时间复杂度:O(n),空间复杂度S(1)。
//算法描述:一次遍历,两个指针分别开始分别指向两个数组。循环控制为是否到两个数组的末尾
//每次循环比较两个指针指向的元素的大小,将小的指针后移,如果发现有相等则有共同元素。
//输出结果。
//**********************************************
//代码描述:
//2015-5-26
//**********************************************
#include<iostream>
using namespace std;
#define MAX 7
bool mycomp(const int *arg1, const int *arg2)//这里传参为const int* 当你的函数中并不是对地址中的
{ //元素进行修改操作时,注意控制权限不会引起错误,同时
int i, j; //更加安全,健壮,方便理解。
if(NULL != arg1&&NULL != arg2) //这里if条件为执行频率较多的条件相对来说效率会高
{ //
for(i = 0, j = 0; i<MAX&&j<MAX; )
{
if(arg1[i] < arg2[j])
++i; //这里用++i而不用i++,是因为i++会在内存中产生中间变量
else if(arg1[i] == arg2[j]) //存在表达式的值,和i的值。而++i则只存在i的值,也就是
return true; //i的值就是表达式的值。
else
++j;
}
return false;
}
else
{
cout <<"Err in args" << endl;
exit(0);
}
}
int main(void)
{
int arg1[MAX] = {1, 4, 6, 7, 8, 9, 10};
int arg2[MAX] = {2, 3, 5, 12, 23, 44, 55};
if(mycomp(arg1, arg2)) //这里的返回值为bool,返回值可以实现链式表达式
cout <<"Be same number" << endl;
else
cout <<"No same number" << endl;
return 0;
}
//很简单的算法,每一步都用最优最高效率的方式去解决其中牵扯到的小的知识点是很多的,
//笔者自己学到了,碰到了,想到了就整理出来了,其中有些地方不足或者没有提到的欢迎指点,谢谢。
//当然,如果真的只是这么很小的程序完全可以写到主函数中,效率最高,但是这是一种习惯,
//也是一种风格,我们不能一味追求效率,忽略掉了语言的健壮性,复用性,伸缩性。当然,
//也可以强词夺理的说,就这么一段代码,效率再提高,也不会有什么影响。这种说法,不可否认
//是正确的,为了以后更好的工作,和做一个优秀的程序员,这是必须清楚的理解并且必须
//养成习惯。代码风格决定发展高度。。。。。。。。。。。。。。。。。。。
原文地址:http://9577782.blog.51cto.com/9567782/1655428