码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-06-26 00:26:31      阅读:549      评论:0      收藏:0      [点我收藏+]

标签:

 

     昨天面试了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
  

 

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

标签:

原文地址:http://www.cnblogs.com/freemindblog/p/4601277.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!