【C++】笔试强训 第一天
如果你已经对C/C++略知一二,现在正在复习C/C++的一些重点知识
这些看似简单的题目能拿满分吗?
-------------------------------------------------------------------------------------------------------------------------
关注我🌈,每天更新总结文章(多以图文形式,方便记忆,均为网上搜集资料以及AI)⭐
-------------------------------------------------------------------------------------------------------------------------
时间:2025/5/22/ 19: 04分
-----------------------------------
博主链接:黎明smaly-CSDN博客
快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区
一、选择题
1.以下 for 循环的执行次数是()
for (int x = 0, y = 0; (y = 123) && (x < 4); x++);
A. 无限循环
B. 循环次数不定
C. 4 次
D. 3 次
答案:C
解析:y=123一直为真 x执行4次++结束
2.以下程序的运行结果是()
#include <stdio.h>
int main(void) {printf("%s , %5.3s\n", "computer", "computer");return 0;
}
A. computer , puter
B. computer , com
C. computer , computer
D. computer , compu.ter
答案:B
解析: %5.3s
5代表输出字符宽度为5个字符,若字符串长度小于5,会在字符串前补空格以达到宽度5 .3代表截取前三个字符
这里就是截取前三个字符,并且前面补两个空格,但显示时一般看不到空格,可以忽略
3.下列 main () 函数执行后的结果为()
int func() { int i, j, k = 0;for(i = 0, j = -1; j = 0; i++, j++) {k++;} return k;
}
int main() {cout << (func());return 0;
}
A. -1
B. 0
C. 1
D. 2
答案:B
解析:j=0是第一次的判断条件,j=0恒为假
4.下面程序输出是什么?
#include <stdio.h>
int main() { int a=1,b=2,c=3,d=0;if(a == 1 && b++==2)if(b!=2||c--!=3)printf("%d,%d,%d\n", a,b,c);else printf("%d,%d,%d\n", a,b,c);else printf("%d,%d,%d\n", a,b,c);return 0;
}
A. 1,2,3
B. 1,3,2
C. 3,2,1
D. 1,3,3
答案:D
解析:主要第二个if 有个短路规则 b!=2为真,然后后面的c--!=3就不再执行了
5.若有定义语句:int a=10;double b=3.14;则表达式 'A'+a+b 值的类型是()
A. char
B. int
C. double
D. float
答案:C
解析:隐式类型转换
6.在 int p [][4] = {{1}, {3, 2}, {4, 5, 6}, {0}}; 中,p [1][2] 的值是()
A. 1
B. 0
C. 6
D. 2
答案:B
解析:这个就不用了把.....
7.选择表达式 11|10 的结果(本题数值均为十进制)()
A. 11
B. 10
C. 8
D. 2
答案:A
解析:或运算符正常运算即可
8.int fun (int a) { a^=(1<<5)-1; return a; } fun (21) 运行结果是()
A. 10
B. 5
C. 3
D. 8
答案:A
解析:^= 异或运算符 相同为0 不同为1
<< 左移 00000001左移5位: 00010000 = 32
9.若有定义语句:int year=1009,*p=&year; 以下不能使变量 year 中的值增至 1010 的语句是()
A. ++(*p)
B. *p++
C. (3)*p+=1;
D. (3)(*p)++
答案:B
解析:++优先级大于*号
10.下面关于 "指针" 的描述不正确的是()
A. 当使用 free 释放掉一个指针内容后,指针变量的值被置为 NULL
B. 32 位系统下任何类型指针的长度都是 4 个字节
C. 指针的数据类型声明的是指针实际指向内容的数据类型
D. 野指针是指向未分配或者已经释放的内存地址
答案:A
解析:释放完,指针变量值不变,需要自己设置为NULL
二、编程题
1.题目链接:组队竞赛_牛客笔试题_牛客网
思路讲解:
根据题目,我们可以发现,尽可能的求出每次第二高的值就是答案
我们怎样拿到第二高呢?我们只需要把最大值拿出放每个组里即可
1.为了更好的取高值,我们首先对数组进行排序,升序,从小到大
2.我们每次取三个值,这三个值我们首先从开头开始取出最小值
然后,从尾巴取出第二高和最大值
3.这样我们第一次取出三个值,就拿到了一个第二高
4再从剩下的里面按次步骤继续取,最后把每组的第二高加起来即可
我们这里不需要每个步骤都写,因为根据结果,总结出了规律,每组的第二高值为
数组名【下标:数组长度-2*i】 i为组数
代码:#include <iostream> #include <algorithm> using namespace std;int main() {int n;scanf("%d",&n);int len = 3*n;int *arr = (int*)malloc(sizeof(int)*len);for(int i = 0;i<len;i++){scanf("%d",&arr[i]);}sort(arr,arr+len);int i = n;long long sum = 0;while(i>0){sum =arr[len-2*i]+sum;i--;}printf("%ld",sum); }
2.题目链接:删除公共字符_牛客题霸_牛客网
思路讲解:
方法一:暴力求解
#include <iostream> #include <string> using namespace std;int main() {string str1, str2;getline(cin, str1);cin >> str2;for(size_t j = 0; j < str2.size(); ++j){while(str1.find(str2[j]) != string::npos)str1.erase(str1.find(str2[j]), 1);}cout << str1 << endl;return 0; }
方法二:使用哈希
字符无非也就128个,我们创建一个128个大小的数组
然后由于频繁的删除会挪动数据,性能降低
我们再开辟一个新字符串,最后转移一下即可
#include <iostream> #include <string> using namespace std;int main() {string str1, str2;getline(cin, str1); // cin遇到空格就结束了,用getline输入一行getline(cin, str2);int hash[128] = {0};string ret;for(int i = 0; i < str2.size(); ++i)hash[str2[i]]++;for(int i = 0; i < str1.size(); ++i){if(hash[str1[i]] == 0)ret += str1[i];}cout << ret << endl;return 0; }