关闭

C/C++校招笔试面试经典题目总结三

853人阅读 评论(0) 收藏 举报
分类:

题目21:求下面函数的返回值,输入x=9999;(微软)

int func(x)
{
    int countx = 0;
    while(x)
    {
        countx ++;
        x = x&(x-1);
    }
    return countx;
} 
解答:

其实这个程序的意思就是求9999的二进制中有多少个1(别问我为什么知道的,可以查看剑指offer面试题10),知道了这个就很容易求解这个题目了!

9×1024中含有1的个数为2;512中含有1的个数为1;256中含有1的个数为1;15中含有1的个数为4;故共有1的个数为8,结果为8。1000 - 1 = 0111,正好是原数取反。这就是原理。用程序中的这种方法来求1的个数是很效率很高的。不必去一个一个地移位。循环次数最少。

题目22:单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。比如一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3->2->1。

解答:

最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。源代码如下:

struct linka 
{ 
    int data; 
    linka* next; 
}; 
void reverse(linka*& head) 
{ 
    if(head ==NULL) 
    return; 
    linka *pre, *cur, *ne; 
    pre=head; 
    cur=head->next; 
    while(cur) 
    { 
        ne = cur->next; 
        cur->next = pre; 
        pre = cur; 
        cur = ne; 
     } 
    head->next = NULL; 
    head = pre; 
} 
还有一种利用递归的方法。这种方法的基本思想是在反转当前节点之前先调用递归函数反转后续节点。源代码如下。不过这个方法有一个缺点,就是在反转后的最后一个结点会形成一个环,所以必须将函数的返回的节点的next域置为NULL。因为要改变head指针,所以我用了引用。算法的源代码如下:

linka* reverse(linka* p,linka*& head) 
{ 
    if(p == NULL || p->next == NULL) 
    { 
        head=p; 
        return p; 
    } 
    else 
    { 
        linka* tmp = reverse(p->next,head); 
        tmp->next = p; 
        return p; 
    } 
} 
题目23:There are two int variables: a and b, don’t use “if”, “? :”, “switch”or other judgement statements, find out the biggest one of the two numbers.

解答:

( ( a + b ) + abs( a - b ) ) / 2

题目24:如何判断一个单链表是有环的?(注意不能用标志位,最多只能用两个额外指针)

struct node { char val; node* next;}
bool check(const node* head) {} //return false : 无环;true: 有环
解答:

一种O(n)的办法就是搞两个指针,一个每次递增一步,一个每次递增两步,如果有环的话两者必然重合,反之亦然。具体代码如下:

bool check(const node* head)
{
    if(head==NULL) return false;
    node *low=head, *fast=head->next;
    while(fast!=NULL && fast->next!=NULL)
    {
        low=low->next;
        fast=fast->next->next;
        if(low==fast) return true;
    }
    return false;
}
题目25:链表题:一个链表的结点结构:

struct Node
{
    int data ;
    Node *next ;
};
typedef struct Node Node ;
(1)已知链表的头结点head,写一个函数把这个链表逆序 (Intel公司)

(2)已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。(保留所有结点,即便大小相同)

(3)已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序,这次要求用递归方法进行。 (Autodesk公司)

解答:

链表是数据结构中比较重要的一块,很多公司都喜欢在这一块出题目。具体的解答代码如下:

(1)链表逆序代码:

Node * ReverseList(Node *head) //链表逆序
{
    if ( head == NULL || head->next == NULL )
    return head;
    Node *p1 = head ;
    Node *p2 = p1->next ;
    Node *p3 = p2->next ;
    p1->next = NULL ;
    while ( p3 != NULL )
    {
        p2->next = p1 ;
        p1 = p2 ;
        p2 = p3 ;
        p3 = p3->next ;
    }
    p2->next = p1 ;
    head = p2 ;
    return head ;
}
(2)合并有序链表代码:

Node * Merge(Node *head1 , Node *head2)
{
    if ( head1 == NULL)
        return head2 ;
    if ( head2 == NULL)
        return head1 ;
    Node *head = NULL ;
    Node *p1 = NULL;
    Node *p2 = NULL;
    if ( head1->data < head2->data )
    {
        head = head1 ;
        p1 = head1->next;
        p2 = head2 ;
    }
    else
    {
        head = head2 ;
        p2 = head2->next ;
        p1 = head1 ;
    }
    Node *pcurrent = head ;
    while ( p1 != NULL && p2 != NULL)
    {
        if ( p1->data <= p2->data )
        {
            pcurrent->next = p1 ;
            pcurrent = p1 ;
            p1 = p1->next ;
        }
        else
        {
            pcurrent->next = p2 ;
            pcurrent = p2 ;
            p2 = p2->next ;
        }
    }
    if ( p1 != NULL )
        pcurrent->next = p1 ;
    if ( p2 != NULL )
        pcurrent->next = p2 ;
    return head ;
}
(3)递归代码:

Node * MergeRecursive(Node *head1 , Node *head2)
{
    if ( head1 == NULL )
        return head2 ;
    if ( head2 == NULL)
        return head1 ;
    Node *head = NULL ;
    if ( head1->data < head2->data )
    {
        head = head1 ;
        head->next = MergeRecursive(head1->next,head2);
    }
    else
    {
        head = head2 ;
        head->next = MergeRecursive(head1,head2->next);
    }
    return head ;
}
题目26:面向对象的三个基本特征,并简单叙述之?

解答:

1. 封装:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private,protected,public)
2.
继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式。
3.
多态:是将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

题目27:类成员函数的重载、覆盖(重写)之间的区别?

解答:

a.成员函数被重载的特征:
1)相同的范围(在同一个类中);
2)函数名字相同;
3)参数不同;
4virtual 关键字可有可无。
b.
覆盖(重写)是指派生类函数覆盖基类函数,特征是:
1)不同的范围(分别位于派生类与基类);
2)函数名字相同;
3)参数相同;
4)基类函数必须有virtual 关键字。

题目28:下列代码正确吗?如果错误请指出来:

char *p = “world”;
p[0] = 'X’;

解答:

*p是指向的是常量字符串,常量字符串是存放在文字常量区的,里面的内容是不能被修改的,而题目中p[0]='X',明显修改了字符串的第一个字符,所以出现了未定义行为错误!

题目29:C++的空类默认会产生哪些类成员函数?

解答:

class Empty
{
    public:
    Empty();//缺省构造函数
    Empty(const Empty &);//拷贝构造函数
    ~Empty();//析构函数
    Empty &operator=(const Empty &);//赋值运算符
    Empty *operator&();//取址运算符
    const Empty *operator& () const;//取址运算符const
}
题目30:C++中的malloc/free和new/delete之间的联系与区别?

解答:

联系:都是在堆(heap)上进行动态的内存操作。

区别:1、malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符。

2、new能够自动分配空间的大小,用malloc函数需要指定内存分配的字节数并且不能初始化对象,new 会自动调用对象的构造函数。

3、对于用户自定义的对象而言,使用malloc/free无法满足动态管理对象和内存的要求。


0
0
查看评论

C/C++校招笔试面试经典题目总结一

过几天就要培训上班了,校园生活也成为了过去式,在未来的道路上努力奋斗,坚持每天一篇技术博客!校园生活还是很轻(堕)松(落)的,但是也有比较辛苦的时候,尤其是校招找工作。互联网行业校招感觉拼的还是每个人的题库量,这里推荐刷题可以去牛客网,那里都是历年各大互联网公司校招的真题。然后算法可以看《编程之美》...
  • Tian779278804
  • Tian779278804
  • 2015-07-08 12:54
  • 2597

C/C++校招面试常考问题

1、虚函数实现机制? 一个virtual函数的类具有一个虚函数表,且该类的每一个对象都有一个虚指针,指向该类的虚函数表。运行的时候,通过对象自己的虚指针来索引正确的虚函数来执行。若基类中虚函数的返回类型为基类型的指针或者引用,则派生类中override这个虚函数的时候需要将返回类型改为派生类类型的引...
  • zhang_guyuan
  • zhang_guyuan
  • 2017-03-06 19:39
  • 956

网易2017校招C++开发工程师(北京)笔试

网易2017校招C++开发工程师笔试卷(0923)一个数字的数位和定义为这个数字所有位置的数值的总和,例如: 1234的数位和为:1+2+3+4=10 5463的数位和为:5+4+6+3=16 现在有3个数A,B,C,需要你求出在A,B范围内(包括A,B)的一个数,让X的数位和与C的数位和差值的绝对...
  • damotiansheng
  • damotiansheng
  • 2016-09-27 15:12
  • 1131

多益网络2015校园招聘面试题目大揭秘

前天笔试完,今天LZ就去面试了。地点什么的就不说了,直接上干货。 1:Leader:你有女朋友?(这也是程序员会问的?我感到有点突然。。。。)     Me::额 ,有        ...
  • u012235132
  • u012235132
  • 2015-03-20 20:01
  • 5449

2016年校招秋招 C++开发 面试问题总结(中兴、CVTE、瑞晟、华为、YY)

校招秋招 C++ 开发 面经
  • zxx910509
  • zxx910509
  • 2017-03-04 17:28
  • 1141

百度2017校招面试总结

百度2017校招面试总结之前报的是百度北京总部的C++软件开发岗,有幸通过了百度2017年校招的笔试,在9月24号参加了百度校招的面试,时间约在了上午11点,总共面了三面。一面一面主要问了以下几个问题: 给出一个正数n,实现一个函数来计算n的平方根,给出误差范围0.0001 这个问题主要有两种思...
  • pc123455
  • pc123455
  • 2016-11-24 13:54
  • 3019

2016金蝶校园招聘面试经验

说到今年的金蝶校园招聘,时间有点久了。金蝶集团来武汉招聘好像是九月中下旬。也是网上投递简历,然后在线笔试。接着就是进入到面试流程。面试的地点在中南路的一个酒店,就在亚贸附近。金蝶租了一个大的会议场,里面大概有5-6个面试官,技术面是一对一的,房间不大,面试的时候有点吵。一面大概面了30分钟左右,主要...
  • luoxueqian
  • luoxueqian
  • 2016-11-22 15:40
  • 1601

2017校招4399面试经验

其实我都不想写43的面经,就四个字形容 "乱七八糟" 我不知道一个我记忆里面的充满了儿时乐趣的公司这么坑爹。 首先通知面试就一条短信,而且是第二天让我去武汉,对比京东,人家还专门打电话问你能不能过来, 43倒好,一条短信下午五点才送达,第二天让我十点赶到华科,完全是单...
  • LHN_hpu
  • LHN_hpu
  • 2016-10-17 17:58
  • 2692

Unity3D游戏客户端开发——2015秋季校招求职总结

Unity3D游戏客户端开发——2015秋季校招求职总结 一、情况介绍 11月初把三方协议给寄出去,我的2015秋季校招也就结束了。两个月的时间里先后面过4399、盛大、37游戏、百田信息、昆仑万维、巨人网络。不知道还有没有其他的,暂时想不起来了。 先介绍本人情况吧:本科。电子类相关专业。虽然以...
  • husheng0
  • husheng0
  • 2015-11-09 22:05
  • 6977

招银科技2017 c++ 面试题

程序内存分布,全局变量、静态变量的存储位置 static修饰符作用 static全局变量跟普通全局变量区别,存储方式有何区别 c++设计一个单例模式,多线程环境下如何设计?用线程锁是否会影响性能?有其他方案吗 介绍下c++ socket 模型, 建立tcp连接的步骤。 多线程同步...
  • yiyecheer
  • yiyecheer
  • 2017-02-18 21:33
  • 1706
    个人资料
    • 访问:63289次
    • 积分:844
    • 等级:
    • 排名:千里之外
    • 原创:34篇
    • 转载:16篇
    • 译文:0篇
    • 评论:12条
    文章分类
    最新评论