群硕笔试面试

来源:互联网 发布:怎么做好网络咨询护士 编辑:程序博客网 时间:2024/06/10 09:13

    群硕笔试答得不好,最后三道编程题都没答对,都是C语言的字符串程序,我记得一题,是求一个字符串里最长的数字增增子串,如果源字符串为“jfkdj456432kk780kjkk12343423456uu” ,则输出“23456” 。

    回来后调试:

 

char* getS(char* src)
{
    int biggest=0;//最长的子串长度
    char* biggest_p=NULL;//指向最长子串的指针
    int length=0;//循环中暂存子串长度
    char* big_p=NULL;//暂存指向最长子串的指针
    char* ret_temp=new char[10];//返回的字符串动态分配内存
    char* ret=ret_temp;

    char* iter=src;//循环用指针
    while( *iter!='/0' )
    {   
        if( *iter>='0' && *iter<='9')
        {
            if(length==0)
            {   
                length++;
                big_p=iter;
            }
            else if(*iter>*(iter-1))
            {
                length++;
                if (length>biggest)
                {
                    biggest=length;
                    biggest_p=big_p;
                }
            }
            else
            {   
                length=1;
                big_p=iter;
            }
        }
        iter++;

    }
    for(int i=0;i<biggest;i++)
        *ret_temp++=*biggest_p++;
    *ret_temp='/0';
    return ret;
}

 

     之前一直不太明白内存动态分配的问题,不知道局部变量是栈里分配的,不知道new和malloc是堆里分配的,完后要自己释放堆内存,也不明白栈与堆的区别,搞清了之后才明白了一点:返回指针类型的函数时,这个指针不能指向局部变量,否则会成为悬浮指针。所以这个函数里用了一个new来动态分配内存,而不是用局部的char数组。不过这个方法肯定不是最佳的,只是能够实现而已。

      本来以为到此为止了,因为感觉答得真的很烂,没想到居然收到了面试通知,于是抱着打酱油和历练的心态去了。面试官劈头便让我来个英文自我介绍,幸好来的路上还小构思了下,基本上能说清在实验室做了啥。然后中文介绍项目,问我遇到最难的一个BUG是什么?我便把SQL存储过程碰到那个问题说了遍。问为什么投C和C++,而不投上层应用,我随便瞎扯了下。之后零零散散问了好多问题,从STL到C的一些基本概念,到进程线程,进程间通信的机制,然后操作系统相关的,由浅入深,问到你不会为止。之后让我问问题,最后给我忠告,人的精力是有限的,不要太分散精力,找一个点好好钻,然后再看其他的会有更通透的理解。出门后一看表,居然耗了一个小时。

      面试其实并不理想,加上巨烂无比的笔试,想去是没戏了,此面试官却如此耐心地问了我一小时的问题,不由让我生出几分敬意,也觉得此次面试让我受益匪浅。记录几个知识盲点:


1.程序运行时内存分配的堆最大是多少?我说我们知道栈是1M到2M,当时只觉得应该可以为内存的大小加上虚拟内存的大小,他没告诉我答案。回来查了一下,有文章提到“大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得空间比较灵活,也比较大。”

2.操作系统CPU分配的最小单位是什么?我说是进程(其实进程是资源分配的最小单位,我当时混了),他便引导我说那一个进程有多个线程同时运行,每个线程不能独立分配CPU?那每个线程怎么分配CPU?我说多线程可以并发执行,每个线程都能分到CPU。那他便问那CPU分配的最小单位是什么?我恍然大悟。

3.STL除了容器还有哪几大类?在他的指示下我说出了 algorithm和iterator,然后便不知道了。

4.const指针的几种不同表示和typedef,#define的区别。让我区分,我说错了一两个,还有预编译的概念。

5.进程间通信的方法?我说消息队列和信号量,他便问文件是否可以?引导了一下,我还是不知,让回家查。

6.vector容器的类数组赋值法,问我是否可行。vector<int> a(10); for(int i=0;i<10;i++) a[i]=i;我说没试过,应该可以,回来后试了下,可行。想到vector是顺序分配内存,支持随机访问,想必是可以的,list则不然,因为不支持随机访问。

 

感觉面试官人挺不错的,引导自己去思考一些东西,让我多深入了解,多去问个为什么。

原创粉丝点击