今天SY回来给我讲了下百度面试的两道题,第一道题是关于m跟球队,n个球队出线需要至少多少分?具体可见:http://blog.sina.com.cn/s/blog_46e25d670100nx4u.html

第二个是:两个有序的存储数字的数组,长度分别为m和n,要求合并两个形成新的字符串,并且新的字符串中不能有重复的数字。SY跟我说了一种时间复杂度为o(m+n)的。

就是用两个指针分别指向两个字符串,然后比较。

然后SY说了,如果其中一个数组中本来就有重复的数字呢?然后我又上网查了下,

先一分析分析 "老迈 "给出的那个 "简洁 "算法:
void   RemoveSame(int   value[],   int   &num)
{
        int     k=0;
        for(int   i=1;   i <num;   i++)
        {
                if(value[i]   !=   value[i-1])
                {
                        value[++k]   =   value[i];
                }
        }
        num   =   ++k;
}
问题一:
函数接口参数不妥:
void   RemoveSame(int   value[],   int   &num)
用int   &num作为数组大小的参数,并将去掉重复数后数组大小值通过num回传给用户.
这样不妥,限制了调用RemoveSame()时,第2个参数必须是一个变量,如果是常量则不行,比如:
RemoveSame(source,   sizeof(source)/sizeof(int));或RemoveSame(source,   5)这样调用这不行.但在实践中用户想如上调用ReomveSame()函数的时候是很多的.
RemoveSame()函数修改了传入参数num,但实际应用中,用户往往不候这个参数被修改.
所以,RemoveSame()函数原型最好这样:
int   unique(int   source[],   int   length);
或int   unique(int   source[],   size_t   length);

问题二
函数名RemoveSame()是典型的 "Chinese-English ",且第一个字母按习惯不应大写.

问题三
对第个参数int   &num没有进行参数合法取值范围检测,当num   <=   0时,结果出错.

问题三
最坏情况下,当n个元素仅在最后一个元素出现重复时,将多运行n-1次赋值语句:value[++k]   =   value[i];

题外话:这类问题,首先想到的应该是用线型链表来解决,而不是数组.

(唉,总是不先思考,上网找答案,以后要避免)明天动手写程序!

posted on 2012-07-12 22:12  applebunny  阅读(605)  评论(0编辑  收藏  举报