面试时做过的几个C/C++笔试题

昨天面试了2家公司,加上上个月28号面试的题目,有几道题目没有做对,在这里总结一下,

避免下次犯同样的错误。

首先是综合题

1. -1,2,7,28,  ,126

解:63

它们的规律是:

0的三次方减1=-1

1的三次方加1=2

2的三次方减1=7

3的三次方加1=28

4的三次方减1=63

5的三次方加1=126

……

n^3+(-1)^n

2. 2,2,3,6,15

解:45

它们的规律是:

2*2/2 2

3*3/2 3

4*3/2 6

5*6/2 15

6*15/2 45

3.  160个人整齐地排成一列,依顺序编号为1、2、3、······159,160.第一次挑选出所有奇数

位置上的人,第二次再从剩余人中挑选出所有奇数位置上的人员,依次类推,请问最后剩下的一个人的

编号是

解:128

160/2=80 80/2=40 40/2=20 20/2=10 10/2=5  5/2=2 2/2=1 共需要选择7次

第1次选出奇数 还有 2 4 6 8... 2的1次方

第2次剔除2 还有4 8... 2的2次方

...

第7次  2的次方=128

3.有一片匀速生长的草场,可供27头牛吃6天,23头牛吃9天,可供21头牛吃几天?

解:重点考虑“匀速生长”的因素

草场每周天生长(9*23-6*27)/(9-6)=15

则原有草27*6-6*15=72

设可供21头牛吃X天

则72+15X=21X

故X=12天

专业题

1.++i i++那个更高效,为什么?

解:++i的效率高些,++i在运算过程中不产生临时对象,返回的就是i,是个左值,类似++i=1这样的

表达式是合法的,而i++在运算的过程中会产生临时对象,返回的是零时对象的值,是个右值,像i+

+=1这样的表达式是非法的

对于内置类型,单独的i++和++i语句,现在的编译器基本上都会优化成++i,所以就没什么区别了

2.指针和引用的区别?

解:1.指针和引用的定义和性质区别:

(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用

跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:

int a=1;int *p=&a;

int a=1;int &b=a;

上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的

地址。

而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一

个存储单元。

(2)可以有const指针,但是没有const引用;

(3)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)

(4)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;

(5)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了

(6)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小;

(7)指针和引用的自增(++)运算意义不一样;

2.指针和引用作为函数参数进行传递时的区别。

(1)指针作为参数进行传递:

用指针传递参数,可以实现对实参进行改变的目的,是因为传递过来的是实参的地址,因此使用*a

实际上是取存储实参的内存单元里的数据,即是对实参进行改变,因此可以达到目的。

(2)将引用作为函数的参数进行传递。

在讲引用作为函数参数进行传递时,实质上传递的是实参本身,即传递进来的不是实参的一个拷贝

,因此对形参的修改其实是对实参的修改,所以在用引用进行参数传递时,不仅节约时间,而且可

以节约空间。

引用进行参数传递时,事实上传递的是实参本身,而不是拷贝。所以在上述要达到同时修改指针的

目的的话,就得使用引用了。

[参考地址]http://www.cnblogs.com/dolphin0520/archive/2011/04/03/2004869.html

3.打印一个二叉树

//二叉树的  创建   输出

#include <stdio.h> 
#include <malloc.h>

typedef int DataType;
typedef struct Node {
    DataType data;
    struct Node *LChild;
    struct Node *RChild;
}BitNode, *BitTree;

/*先序创建二叉树*/ 
void CreatBiTree(BitTree *bt) {
    char ch;
    ch = getchar();
    if (ch  == ‘.‘) *bt  = NULL;
    else  { *bt  = (BitTree)malloc(sizeof(BitNode));
    (*bt)->data  = ch;
    CreatBiTree(&((*bt)->LChild));
    CreatBiTree(&((*bt)->RChild)); }
}

void Visit(char ch) { 
    printf("%c  ", ch); 
}
/*先序遍历二叉树*/ 
void  PreOrder(BitTree root)  {
    if (root  != NULL)  {
        Visit(root->data);
        PreOrder(root->LChild);
        PreOrder(root->RChild);
    }
}

/*中序遍历二叉树*/ 
void  InOrder(BitTree root)
{
    if (root  != NULL)  {
        InOrder(root->LChild);
        Visit(root->data);
        InOrder(root->RChild);
    }
}
/* 后序遍历二叉树*/ 
void  PostOrder(BitTree root)
{
    if (root  != NULL)  {
        PostOrder(root->LChild);
        PostOrder(root->RChild);
        Visit(root->data);
    }
}
//后序遍历求二叉树的高度递归算法// 
int PostTreeDepth(BitTree bt)
{
    int hl, hr, max;  if (bt  != NULL)  {
        hl  = PostTreeDepth(bt->LChild);
        //求左子树的深度    
        hr  = PostTreeDepth(bt->RChild);
        //求右子树的深度    
        max  = hl > hr ? hl : hr;
        //得到左、右子树深度较大者   
        return(max + 1);
        //返回树的深度  
    }
    else 
        return(0);
    //如果是空树,则返回0 
}

void main()
{
    BitTree T;     int h;
    int layer;     int treeleaf;     layer = 0;
    printf("请输入二叉树中的元素(以扩展先序遍历序列输入,其中.代表空子树):\n");     CreatBiTree(&T);
    printf("先序遍历序列为:");     PreOrder(T);
    printf("\n中序遍历序列为:");     InOrder(T);
    printf("\n后序遍历序列为:");
}

[参考地址]http://wenku.baidu.com/link?url=QssTB4uNsFWifuB0OvyfyryHBo-cQys4hkFn5MEnuEVWZQwQzv-zX1_SSug9W9m3wz3ipHnc7F4C0hQUayBOiSGqF1ujTTdKCXNJ46iDaui

[参考地址]http://blog.csdn.net/luckyxiaoqiang/article/details/7518888

时间: 2024-12-26 01:35:18

面试时做过的几个C/C++笔试题的相关文章

在做技术面试官时,我是这样甄别大忽悠的——如果面试时你有这样的表现,估计悬

记得我刚做技术面试官的时候,还比较单纯,别人说什么就信什么.这本来也没多大的错,虽然有些候选人会夸张自己的技能,但毕竟大多数候选人都是比较诚实的,相信绝大多数的技术面试官也像我这样,会以君子之心度人的. 但我面试了一阵后,有项目经理向我反映,经我手面试通过的一些候选人有存在实际技能与简历上描述不符的情况,比如简历上写的是熟悉Linux操作,但实际也就会几个命令,又如简历上写的是熟悉Spring Cloud,也有实际项目经验,但后来发现他其实没做过Spring Cloud的实际项目,简历上的项目是

面试时,当你有权提问时,别客气,这是个逆转的好机会(内容摘自Java Web轻量级开发面试教程)

前些天,我在博客园里写了篇文章,如何在面试中介绍自己的项目经验,收获了2千多个点击,这无疑鼓舞了我继续分享的热情,今天我来分享另外一个面试中的甚至可以帮助大家逆转的技巧,本文来是从 java web轻量级开发面试教程从摘录的. -------------------------------------------------------------------------------------------------------------------------------- 1 问题的背景

面试时经常会被问到的 3 个问题

前几天,我在<简历中打动人的 3 个关键点>和<简历中千万不要出现的 3 个问题>中讲了一些写简历的注意事项,今天想聊聊在面试过程中,如何更好的体现出自己的真实实力. 面试时,我经常会拿下面 3 个问题开场: 1.请做个简短的自我介绍:2.简单介绍一个自己参与度比较高的项目,以及自己在项目中的职责:3.简单描述下你在项目中发现的最有成就感的 Bug: 下面我分别针对这 3 个问题逐一做下说明. 1.请做个简短的自我介绍: 大部分的鸡汤文或者面经给出的建议可能是这样: 面试官你好,我

内向的人在面试时如何表现自己?

作者 | Jenny | 36kr 对于性格内向的人来说,现场面试常常是让人焦虑不安的.性格内向的人在面试中常常容易紧张,在面试过程容易让人感到冷场.木讷.束缚感,从而影响到实际水平的发挥. 不过,如果你是性格内向的人,你也不用过分担心. 事实上,性格内向的人在面试中也有自己的优势.因为担心面试紧张,性格内向的人在准备面试时,往往更为充分. 下面有一些小技巧帮助你在面试中给面试官留下积极的印象. 1. 不要尝试假装自己是外向型的人 永远不要伪装.这就像是东施效颦,过犹不及. 即使你意外地在某次面

程序员在面试时更好的介绍项目经历

在面试时,经过寒暄后,一般面试官会让你介绍项目经验.常见的问法是:“说下你最近的(或最拿得出手的)一个项目”. 根据我的面试经验,发现有不少程序员对此没准备,说起来磕磕巴巴,甚至有人说出项目经验从时间段或技术等方面和简历上的不匹配,这样就会造成如下的后果. 第一印象就不好了,至少会感觉该候选人表述能力不强. 一般来说,面试官会根据程序员介绍的项目背景来提问题.假设面试时会问10个问题,那么至少有5个问题会根据程序员所介绍的项目背景来问,程序员如果没说好,那么就没法很好地引导后继问题了,就相当于把

HR要求来面试的程序员做笔试题被拒,听到原因懵了

在职场中,经常会遇到能力很强,但是工作态度却很一般,有点恃才傲物的员工,对于这样的情况,放弃又有点舍不得,不放弃又可能会影响到团队氛围.而如果面试中遇到这样的求职者该怎么办呢? 最近在互联网论坛上看到这样一个帖子:HR面试一位能力很强的程序员,要求做笔试题被拒:应届生才做笔试呢!网友评论炸锅了!到底是怎么回事呢? 这位HR在帖子中说自己遇到过这样一个程序员,写代码的技术还是非常不错的,在简历中也可以看出来.只是这个程序员有点太自大了.按照公司流程,HR要求程序员做一套笔试题.可那个程序员直接就说

面试时面试官想要听到什么答案(关于一些vue的问题)

前言 自己也只是一个前端的小白,因为公司大佬都比较忙,面试这种事就落到了我这小白身上,第一次叫我去的时候我是百般拒绝的,因为自己还是有自知之明的,但是别人实在抽不开身,没办法只能去了,他们开玩笑说就按你这水平来就行了,啥时候你问不住了就让他来复试就行.前前后后也面了一些人,加上自己面试时候整理的一些问题,写了这篇文章,感谢拨冗翻阅拙作,敬请斧正. 下面进入正文,本文会列举一些平时面试时问到的问题和答案,并说明我在当时问到这个问题时所期望对方的回答: 问题 请说一下vue的生命周期函数(钩子函数)

还记得面试时被算法支配的恐惧吗?

还记得面试时被算法支配的恐惧吗? <font size = '5'>?<center>面试造火箭,上班拧螺丝</center> </font> 大多数程序员心里会想"总结的真精辟",当面试到算法时,各种"跪"."再跪"."还是跪"......,多少人因为算法而拿不到心仪的offer,算法毁一生啊. 智力面试时代 现在算法已经成为大厂面试的重中之重,甚至一些国外的大厂只面试算法,为

面试时碰到的一道数据库题目

这几天面试了不少单位.做了些笔试题.做完回来都会回顾一下.做下整理. 例如以下是一些问题的列表 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 今天给我印象比較深刻的题目是一道数据库操作题 题目:有例如以下三张表,要求查询出[职位仅仅有开发]的全部员工的eid和ename 一開始感觉非常easy.把