笔试面试题二

1、C字符串是以‘\0’字符作为结束标志的

    char *p="abcde\0fghjik\0";
    printf("%d\n" , strlen(p));    //5  (a、b、c、d、e)
	
    char acNew[20]= "\\0\0";
    printf("%d\n",strlen(acNew));  //2  (\和0)

2、构造函数和虚析构函数

#include "stdafx.h"
#include <string>
#include <iostream.h>

class A
{
public:
	A(){cout<<"A Construct!"<<endl;}
	virtual ~A(){cout<<"A Destroy!"<<endl;}  //虚析构函数

};

class B:public A
{
public:
	B(){cout<<"B Construct!"<<endl;}
	~B(){cout<<"B Destroy!"<<endl;}
};

int main(int argc, char* argv[])
{
	A *a1=new B;  //A Construct!   B Construct!
	delete a1;    //B Destroy!     A Destroy!

	A *a2=new A;  //A Construct!
	delete a2;    //A Destroy!

	B *b=new B;   //A Construct!   B Construct!
	delete b;     //B Destroy!     A Destroy!

	return 0;
}

3、指针数组和指向数组的指针的区别

       char *a[]={"abc","cde","fgh"};   //字符指针数组

       char **b=a;     //ok

       int a[3][4];

       int (*p)[4]=a;   //ok,指向含有4个整型元素的一维数组的指针

       int  **p = a;     //error

4、不要返回临时变量的引用

       float &test(float a,float b)

       {

           float c=a*b;

           returnc;           //返回临时变量的引用,当函数结束后,该临时对象内存被释放掉,返回的引用变成空引用

       }

5、const引用的特殊用处(const变量在编译期间就已经确定初始值了)

     int a = 10;

      double &test = a + 0.2;              //error,不同类型的引用

      const double &test = a + 2.0;     //ok,const引用可用于不同类型之间

      const int &ra=a;

      ra=1;  //error

      a=1;   //ok

      void bar(string &s);

      bar(“hello”);      //error,试图将一个const 对象转换为非const

6、桶排序介绍

       输入是由一个随机过程产生的[0, 1)区间上均匀分布的实数。

       将区间[0, 1)划分为n个大小相等的子区间(桶),每个桶大小1/n:[0, 1/n), [1/n, 2/n), [2/n, 3/n),…,[k/n, (k+1)/n ),…,

       将n个输入元素分配到这些桶中,对桶中元素进行排序,

       按照顺序将各个桶中的元素列出来。

7、在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路

        解法:首先假设是32位无符号整数。
          1. 读一遍10G个整数,把整数映射到256M个区段中,用一个64位无符号整数给每个相应区段记数。说明:整数范围是0 - 2^32- 1,一共有4G种取值,映射到256M个区段(256M个桶),则每个区段有16(4G/256M = 16)种值,每16个值算一段, 0~15是第1段,16~31是第2段,……2^32-16 ~2^32-1是第256M段。一个64位无符号整数(计数)最大值是0~8G-1,这里先不考虑溢出的情况。总共占用内存256M×8B=2GB。
         2. 从前到后对每一段的计数累加,当累加的和超过5G时停止,找出这个区段(即累加停止时达到的区段,也是中位数所在的区段)的数值范围,设为[a,a+15],同时记录累加到前一个区段的总数,设为m。然后,释放除这个区段占用的内存。
         3. 再读一遍10G个整数,把在[a,a+15]内的每个值计数,即有16个计数。
         4. 对新的计数依次累加,每次的和设为n,当m+n的值超过5G时停止,此时的这个计数所对应的数就是中位数。

你可能感兴趣的:(c,面试,String,delete,Class,float)