zoukankan      html  css  js  c++  java
  • 面试时做过的几个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("请输入二叉树中的元素(以扩展先序遍历序列输入,其中.代表空子树): ");     CreatBiTree(&T);
        printf("先序遍历序列为:");     PreOrder(T);
        printf(" 中序遍历序列为:");     InOrder(T);
        printf(" 后序遍历序列为:");
    }
    [参考地址]http://wenku.baidu.com/link?url=QssTB4uNsFWifuB0OvyfyryHBo-cQys4hkFn5MEnuEVWZQwQzv-zX1_SSug9W9m3wz3ipHnc7F4C0hQUayBOiSGqF1ujTTdKCXNJ46iDaui
    [参考地址]http://blog.csdn.net/luckyxiaoqiang/article/details/7518888
      
  • 相关阅读:
    bzoj 4012: [HNOI2015]开店
    POJ 1054 The Troublesome Frog
    POJ 3171 Cleaning Shifts
    POJ 3411 Paid Roads
    POJ 3045 Cow Acrobats
    POJ 1742 Coins
    POJ 3181 Dollar Dayz
    POJ 3040 Allowance
    POJ 3666 Making the Grade
    洛谷 P3657 [USACO17FEB]Why Did the Cow Cross the Road II P
  • 原文地址:https://www.cnblogs.com/freemindblog/p/4601277.html
Copyright © 2011-2022 走看看