牛客网C++入门笔试题错题集(1)

练习题入口

写在前面的总结:感觉自己C++学了一个学年,知识点也差不多该掌握了。但是即使是学过的内容,也有遗忘的和之前不重视的;没学过的,也有一些知识点。要多复习,多学课外的内容。下面是这次练习的错题集:

1.在c++中的结构体是否可以有构造函数?
A.不可以,结构类型不支持成员函数
B.可以有
C.不可以,只有类允许有构造函数

  • 在c++中类和结构体的唯一区别是:
    • 默认状态下,类中的成员默认是私有的,结构体中的成员默认是公有的。
  • c++中的结构体和c中的结构体的区别:
    • c++中的结构体引入了成员函数,继承,访问控制等面向对象的特性
  • c中的空结构体的大小为0,c++中的空结构体和空类一样,大小是1。c++中空类的大小是1的原因:
    • 空类可以实例化成不同的对象,不同的对象在内存中的地址不同,所以隐含地加入一个字节来标识不同的对象。

5 . T是一个数据类型,关于std::vector::at 和 std::vector::operator[] 描述正确的是:
A.at总是做边界检查, operator[] 不做边界检查.
B.at 不做边界检查, operator[] 做边界检查.
C.at和operator[] 是一样的

  • 使用两种方法来访问vector。
    • vector::at()
    • vector::operator[]

operator[]主要是为了与C语言进行兼容。它可以像C语言数组一样操作。但at()是我们的首选,因为at()进行了边界检查,如果访问超过了vector的范围,将抛出一个例外。由于operator[]容易造成一些错误,所有我们很少用它,下面进行验证一下:


vector<int> v;
v.reserve(10);
  
for(int i=0; i<7; i++)
    v.push_back(i);
  
try
{
 int iVal1 = v[7]; // not bounds checked - will not throw
 int iVal2 = v.at(7); // bounds checked - will throw if out of range
}
catch(const exception& e)
{
 cout << e.what();
}

9.下列字符串可以用作C++标识符的是:
A._123
B.2009var
C.goto
D.test - 2009

  • 标识符

  • 标识符用来表示函数、类型及变量的名称,是字母、下划线和数字的排列。
  • 必须用字母或下划线开头。
  • 只能是字母、下划线、数字的组合,不能出现其他符号。
  • 大小写的含义是不同的。
  • 标识符的名称不能是C语言中的关键字,因为关键字是具有特定含义的标识符。

11.STL中的一级容器有:
A.vector, deque, list, set, multiset, map, multimap.
B.序列容器,关联容器,容器适配器
C.set, multiset, map, multimap.
D.vector, deque, list.

  • STL中的常用容器包括:顺序性容器(vector、deque、list)、关联容器(map、set)、容器适配器(queue、stack)

12.如果有一个类是 myClass , 关于下面代码正确描述的是:

`myClass::~myClass(){
delete this;
this = NULL;
}`

A.正确,我们避免了内存泄漏
B.它会导致栈溢出
C.无法编译通过
D.这是不正确的,它没有释放任何成员变量。

  • 编译不通过主要是语句 this=NULL;
  • 因为类的构造函数中,this 指针的形式为Myclass *const this; 它是一个常量指针,指针的指向不能修改。

14.在下列排序算法中,哪几个算法的时间复杂度与初始排序无关()
A.插入排序
B.堆排序
C.冒泡排序
D.归并排序
E.选择排序

记忆口技:选堆快希不稳 选堆归基不变

直接插入排序:

  • 算法思想:将第i个记录插入到前面已经排好序的i - 1个记录中去。
  • 算法要点:
  • 使用监视哨r[0]临时保存带插入记录
  • 从后往前查找应插入的位置
  • 查找与移动用同一循环完成
  • 算法时间复杂度:o(n^2)

折半插入排序:

  • 算法思想:利用折半查找的思想找到需要插入的位置
  • 算法时间复杂度:o(n^2),虽然减少了查找插入位置的次数,但是移动元素的时间仍未改变

希尔排序:

  • 算法思想:将待排序的关键字序列分成若干个较小的子序列,对子序列进行直接插入排序,使整个待排序序列排好序。
  • 算法时间复杂度:o(n^1.5)

快速排序:

  • 算法思想:从待排序记录中选择一个记录为枢纽,设为K,将其余大于K的记录移动至K的后面,小于K的移动至前面,此过程称为一趟快速排序。当然就是对接下来的两个字表进行相同的操作,直到子表的长度不超过1
  • 算法时间复杂度:o(Knlog2n),K为常数因子,且在所有O(nlogn)复杂度中,快排的K值最小

简单选择排序:

  • 算法思想:
  • 第一趟:从第一个记录开始,通过n-1次关键字比较,从n个记录中选出最小的并和第一个记录交换;
  • 第二趟:从第二个记录开始,通过n-2次关键字比较,从n -1个记录中选出最小的并和第二个记录交换;
  • ……
  • 算法时间复杂度:o(n^2)

堆排序:

  • 算法思想:将向量中存储的数据看成一棵完全二叉树,利用完全二叉树中双亲节点和孩子节点之间的内在关系选择关键字最小的记录。
  • 大根堆:各节点关键字满足:a[i] >= a[2i]并且a[i] >= a[2i + 1]
  • 小根堆:各节点关键字满足:a[i] <= a[2i]并且a[i] <= a[2i+1]
  • 算法时间复杂度:o(nlogn)

归并排序:

  • 算法思想:设初始序列长度为n,将这n个序列看成n个有序的子序列,然后辆辆合并,得到一个ceil(n/2)长度为2的有序子序列。
  • 在此基础上再对长度为2 的有序子序列进行归并排序,得到若干长度为4的子序列,如此重复直到得到一个长度为n的有序子序列为止
  • 时间复杂度:o(nlogn)

17.在C++中,下列不正确的转义字符是( )
A.’\’
B.‘074’
C.’\t’
D.’\0’

  • A 转义字符,就是反斜线字符\
  • B 错误,内容是3个字符,如果是’\074’则是正确的8进制转义 '\074’才是转义字符
  • C 跳到下一制表区
  • D 字符串的末尾
  • 补充:074表示八进制整数,不是转义字符。转义字符的定义为:所有的 ASCII码 都可以用“\”加数字(一般是8进制数字)来表示。而C中定义了一些字母前加""来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。

18.已知fun(int)是类Test的公有成员函数,p是指向成员函数fun()的指针,采用( )是正确的。
A.p=fun
B.p=Test::fun()
C.p=fun()
D.p=&Test::fun

  • 有括号函数调用,函数名取地址和不取地址都表示地址
  • C++中,获取非静态成员函数时,必须加上&符号,获取静态成员函数时,&符号是可选的。
  1. 类模板的使用实际上是类模板实例化成一个具体的__________。
    A.类
    B.函数
    C.模板类
    D.对象
  • 类模板的使用实际上是先将类模板实例化为模板类,再实例化成一个具体的类。
  1. 下面代码的输出是什么?
auto fn = [](unsigned char a){
    cout << std::hex << (int)a << endl;
};
fn(-1);

A. ff
B. 256
C.-1
D.Undefined 0

  • int型-1的存储方式为补码(32位,4字节),1111 1111 1111 1111 1111 1111 1111 1111
  • 转换为unsigned char(8位,1字节)发生字节截断,取最后八位为1111 1111
  • 再转换为int后为0000 0000 0000 0000 0000 0000 1111 1111,即为ff

25.广义表L=(a,(b,c)),进行Tail(L)操作后的结果为( )。
A.c
B.((b,c))
C.b,c
D.(b,c)

  • 取表头:取出的表头为非空广义表的第一个元素,它可以是一个单原子,也可以是一个子表。
  • 取表尾:取出的表尾为除去表头之外,由其它元素构成的表。重点是表尾一点是一个广义表。

26.已知广义表LS=((a,b,c),(d,e,f)),运用head和tail函数取出LS中原子e的运算是( )。
A.head(tail(head(tail(LS))))
B.head(tail(LS))
C.head(tail(tail(head(LS))))
D.tail(head(LS))

  • head是取广义表的第一个元素(外层的括号去除),tail是取去掉第一个元素以后的所有尾部元素(注意外层的括号不能去除)
  • 广义表LS=((a,b,c),(d,e,f))
    tail(LS)=((d,e,f)) 这里有两层括号,所以下面要用到head去掉外层的括号
    head(tail(LS))=(d,e,f)
    tail(head(tail(LS) )) = (e,f)
    head(tail( head(tail(LS) ) )) = e

28 . 含n个顶点的连通图中的任意一条简单路径,其长度不可能超过()
A.n/3
B.n/2
C.1
D.n-1

  • 简单路径就是指路径中不含有重复的节点,节点只经过一次,最长的路径肯定就说所有节点都走一次,也就是边的条数,就是n-1
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值