• 面试时做过的几个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
      
  • 相关阅读:
    Haskell语言学习笔记(76)Data.Tree
    C++17尝鲜:编译期 if 语句
    C++17尝鲜:variant
    Haskell语言学习笔记(75)Conduit
    C++17尝鲜:string_view
    Haskell语言学习笔记(74)GADTs
    Haskell语言学习笔记(73)Existentials
    Haskell语言学习笔记(72)Free Monad
    sum of powers
    「2017 山东一轮集训 Day7」逆序对
  • 原文地址:https://www.cnblogs.com/freemindblog/p/4601277.html
Copyright © 2020-2023  润新知