2014年腾讯校招笔试题详解

插入排序对于几乎有序的数组效率很高,改进后的冒泡排序对于几乎有序的数组效率也很高,快速排序在极端条件下可能退化为

O(n^2),

 

这道题目较难

属于A类的私有地址:

10.0.0.0 – 10.255.255.255

属于B类的私有地址:

172.16.0.0 – 172.31.255.255(记住是16-31)

属于C类的私有地址:

192.168.0.0 – 192.168.255.255

显然D是错误的。

中缀转后缀,今年来没有出现过

1. 单例模式:只有一个实例存在的类。

2. 桥接模式:将一个对象的抽象部分从实现中分离出来。

3.组合模式:多个对象组成树状结构来表示局部与整体,这样用户可以一样的对待单个对象和对象的组合。

4. 外观模式:为子系统中的一组接口提供一个一致的界面, 外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

析构函数虚函数

D

是针对具体数据库管理系统而言的,本题针对的是关系型数据库的特点,即采用关系作为逻辑结构的数据库的特点。

原地逆序数组只需要交换一半,链表需要完全逆序。

这道题目比较直接6544

难题

typedef char *String_t; 和#define String_d char * 这两句在使用上有什么区别?

答:typedef char *String_t 定义了一个新的类型别名,有类型检查。而#define String_d char * 只是做了
个简单的替换,无类型检查,前者在编译的时候处理,后者在预编译的时候处理。
同时定义多个变量的时候有区别,主要区别在于这种使用方式String_t a,b; String_d c,d; a,b ,c 都是
char*类型,而d 为char 类型
由于typedef 还要做类型检查。。#define 没有。。所以typedef 比#define 安全。。

 

到商店里花 200块钱买商品返还 100 优惠券(可以在本商店代替现金)。请问实际上折扣是多少?

200/300 = 66.7%

已知rand7()可以产生1~7的7个数(均匀概率),利用rand7() 产 生 rand10() 1~10(均匀概率)。

int rand10() {
    int i = rand7() - 1;
    int j = rand7() - 1;
    int num = 7 * i + j;
    if(num >= 40)
         return rand10();
    else
         return num % 10 + 1;

给定能随机生成整数 1 到 5 的函数,写出能随机生成整数 1 到 7 的函数。

ARP(AddressResolutionProtocol)(地址解析协议)

 

类型声明符在C语言里面主要有三个用途:

1.声明静态局部变量

2.声明静态外部全局变量

3.声明静态外部函数

1. 指针是一个实体,而引用仅是个别名;

2. 引用使用时无需解引用(*),指针需要解引用;

3. 引用只能在定义时被初始化一次,之后不可变;指针可变;

4. 引用没有 const,指针有 const;

5. 引用不能为空,指针可以为空;

6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;

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

8.从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。

平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

1,静态成员函数不可以是虚函数,因为静态成员函数全局通用,不受限于某个具体对象

2,构造函数不可以是虚函数,虚函数主要是针对对象而言,而构造函数是在对象创建之前,所以构造函数的虚函数是没有意义的

3,内联函数不可以是虚函数,因为内联函数不能再运行中动态确定其位置

Internet采用哪种网络协议?该协议的主要层次结构?

TCP/IP协议

从上往下依次为:应用层,传输层,网络层,网络接口层

网络号和主机号

除了整型,枚举类型,字符型,其他的都不行。譬如:字符串,浮点型这些都不可以作为switch的参数类型。

答:extern

可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

 

1. 静态全局变量与静态局部变量的区别

(a)全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

(b)把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。

(c)static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件

static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;

static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;

static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

改错

int main()
 {
  char* src = "hello,world";
  int len = strlen(src);
  char* dest = (char*)malloc(len+1);//要为\0分配一个空间
  char* d = dest;
  char* s = &src[len-1];//指向最后一个字符
  while( len-- != 0 )
  *d++=*s--;
  *d = 0;//尾部要加\0
  printf("%s\n",dest);
  free(dest);// 使用完,应当释放空间,以免造成内存汇泄露
  return 0;
 }

第一步,首先统计三百万条不重复数据出现的频率,这一个可以用一个Hash表实现

注意:300万个字符串最多(假设没有重复,都是最大长度)占用内存3M*1K/4=0.75G。所以可以将所有字符串都存放在内存中进行处理。

然后维护一个最小堆,用topK问题的方法解决

默认参数问题

重载: 参数表 必须 不同( 参数个数不同or参数类型不同or参数个数与类型都不同),与 返回值类型值无关

基类与派生类的构造和析构函数顺序

C++ 模板类型

 

答案A,表示A是基类,B是派生类,向上级类型转换是隐式的,因为部分元素丢弃可以自动完成,向下转型是显式的因为不知道应该增加的值是什么。所以B不能。

答案C,Operator除了表示函数重载操作符,还可以表示B类型可以装换为A类型。这个知识点就有点偏了。

答案D,拷贝构造函数, B b = A 肯定是可以的。

注意是错误的是

这到题目容易犯傻,b-a已经是整数了

宏定义的只替换不组合必考

考了一道多继承虚函数的题目

特殊值法m=1

A:正确,B 错的,
首先 #include<> 和 #include"" 只是最先搜索的路经不一样。
#include<>  :表示只从从标准库文件目录下搜索,对于标准库文件搜索效率快。
#include""    :表示首先从用户工作目录下开始搜索,对于自定义文件搜索比较快,然后搜索整个磁盘

裸的0,1背包问题,这里是求一组解

我们用f[i][j]用来表示前i件物品随意选择一些物品能够恰好装满容量为j的背包的可行性=1,不可行则为0;

 

void packageInteration(vector<int> vec, int S){
    int n = vec.size();
    int **f = new int*[n+1];
    for(int i = 0; i < n+1; i++){
        f[i] = new int[S+1];
        memset(f[i], 0, sizeof(f[i])*(S+1));
    }
    for(int i = 0; i < n+1; i++)
        f[i][0] = 1;   // 初始化
    for(int i = 1; i < n+1; i++){
        for(int j = 1; j < S+1; j++){
            if(j >= vec[i-1])
                f[i][j] = (f[i-1][j] || f[i-1][j-vec[i-1]]);
            else
                 f[i][j] = f[i-1][j];
        }   
    }
    // 回溯求结果
    int j = S;
    for(int i = n; i > 0; i--){
        if(j >= vec[i-1]){
            if(f[i][j-vec[i-1]] == 1){   // 为1 表示可行
                res.push_back(i);
                j = j - vec[i-1];
            }
        }
    }
}

 

 阅读下列函数说明和C代码,将应填进(n)处的字句写在答题纸的对应栏内。
【说明】设有一个带表头结点的双向循环链表L,每个结点有4个数据成员:指向先驱结点的指针prior、指向后继结点的指针next、存放数据的成员data和访问频度freq。所有结点的freq初始时都为0.每当在链表上进行一次L.Locate(x)操纵时,令元素值x的结点的访问频度freq加1,并将该结点前移,链接到现它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。

1. p->data!=x

2.p->freq++

3.p->freq<current->freq

4. p->next

5.current

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值