目录
前言
本栏目主要为准备备战秋招的小伙伴准备,博主会每天准备一些题目,如果有兴趣跟着博主每日一刷吧!加油加油!
一、选择题
1、以下for循环的执行次数是()
for(int x = 0, y = 0; (y = 123) && (x < 4); x++);
A. 是无限循环
B. 循环次数不定
C. 4次
D. 3次
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
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
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
5、若有定义语句: int a=10 ; double b=3.14 ; 则表达式 'A'+a+b 值的类型是()
A. char
B. int
C. double
D. float
6、在 int p[][4] = {{1}, {3, 2}, {4, 5, 6}, {0}}; 中,p[1][2]的值是()
A. 1
B. 0
C. 6
D. 2
7、选择表达式 11|10 的结果(本题数值均为十进制)()
A. 11
B. 10
C. 8
D. 2
8、fun(21)运行结果是()
int fun(int a)
{
a^=(1<<5)-1;
return a;
}
A. 10
B. 5
C. 3
D. 8
9、若有定义语句:int year=1009,*p=&year;以下不能使变量 year 中的值增至 1010 的语句是()
A. *p+=1;
B. (*p)++;
C. ++(*p)
D. *p++
10、下面关于"指针"的描述不正确的是()
A. 当使用free释放掉一个指针内容后,指针变量的值被置为NULL
B. 32位系统下任何类型指针的长度都是4个字节
C. 指针的数据类型声明的是指针实际指向内容的数据类型
D. 野指针是指向未分配或者已经释放的内存地址
二、编程题
1、组队竞赛 题目链接
输入描述:
输入的第一行为一个正整数n(1 ≤ n ≤ 10^5) 第二行包括3*n个整数a_i(1 ≤ a_i ≤ 10^9),表示每个参赛选手的水平值.
输出描述:
输出一个整数表示所有队伍的水平值总和最大值.
2、删除公共字符 删除公共字符
输入描述:
每个测试输入包含2个字符串
输出描述:
输出删除后的字符串
三、选择题题解
1、以下for循环的执行次数是()
for(int x = 0, y = 0; (y = 123) && (x < 4); x++);
A. 是无限循环
B. 循环次数不定
C. 4次
D. 3次
正确答案:C
题解:
这题主要考察对于逻辑运算符与(&&)的理解,我们首先要知道的是,与是双目运算符,只有左右两个表达式都为真的时候才为真,我们先看与(&&)左边的表达式,y = 123,注意,这是一个赋值表达式,返回值为赋值符右边的值,为123,非零,故为真,且永为真,所以我们接下来只考虑右边的表达式 x < 4,x的初值为0,且每次循环+1,故循环4次到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
题解:
此题涉及printf函数的格式控制的使用,这里我们要打印的是字符串(%s),百分号与s中出现了一个5.3,这时很多小伙伴就看不懂了,首先我们把5.3看成格式m.n,其中m代表打印所占的屏幕像素个数,如果m大于字符串个数时,会将字符串都打印出来;比如
char* str1 = "hello";
printf("%3s", str1); // 这里依旧打印五个字符hello
printf("%7s", str1); // 这里会打印 hello,但是不同的是这里前面会补两个像素(空格)位置
如果格式为%-ms;代表右对齐(默认为左对齐),此时像素会在后面补;
%.ns中的n代表我们要输出几个字符,从左到右依次去字符;看本题为%5.3s;因此我们首先取5个屏幕像素,且以默认的左对齐;接着.3;我们取三个字符;因此答案为B;
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;为一个赋值,并不是双等号的判断,因此,我们前面提过,赋值的返回值为其所赋的值,本题为0,为假,故循环一次都不会进去,故返回值k为0;打印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的后置++,故也为真;且运行完此行后,b的值为3;接着进入第六行的 if 语句,这里是逻辑或,b!=2为真,故右边的表达式无需进入(c--未运行),直接打印最后结果;
5、若有定义语句: int a=10 ; double b=3.14 ; 则表达式 'A'+a+b 值的类型是()
A. char
B. int
C. double
D. float
正确答案:C
题解:
这里主要考察类型转换的问题,在C/C++中,在不同类型进行运算时,会往类型大的那个类型进行转换,这里字符A+a(int),结果转换为int型,接着+b(double),结果转换为double型;
6、在 int p[][4] = {{1}, {3, 2}, {4, 5, 6}, {0}}; 中,p[1][2]的值是()
A. 1
B. 0
C. 6
D. 2
正确答案:B
题解:
这里是对二维数组的考察,数组的下标是从0开始的,根据题意,我们需要的值为第二行第三个数据,但是第二行才初始化了两个数据,其他位置补0,因此答案为B;
7、选择表达式 11|10 的结果(本题数值均为十进制)()
A. 11
B. 10
C. 8
D. 2
正确答案:A
题解:
这里考察的是位运算符按位或(|),即每个比特位按位或,如果有一个为1则将这个比特位置为一,只有全零才将这个比特位置为零;我们将这两个数按二进制展开并或,得到结果11;
8、fun(21)运行结果是()
int fun(int a)
{
a^=(1<<5)-1;
return a;
}
A. 10
B. 5
C. 3
D. 8
正确答案:A
题解:
这里考察的也是位运算,左移操作符(<<),将数字的二进制形式向左移,右边补零;按位异或运算符(^),把两个数的二进制位按位异或,异或规则:相同置为0,不同置为1;这里注意是^=,意味着我们先将^=右边的表达式运算完后再进行^=;不难算出最后结果为10;
9、若有定义语句:int year=1009,*p=&year;以下不能使变量 year 中的值增至 1010 的语句是()
A. *p+=1;
B. (*p)++;
C. ++(*p)
D. *p++
正确答案:D
题解:
这里主要考察运算符的优先级与结合性,我们首先查表,发现*与++是同一等级运算顺序;我们再看结合顺序,发现结合顺序是从右到左,因此先计算++,然后再计算*;
10、下面关于"指针"的描述不正确的是()
A. 当使用free释放掉一个指针内容后,指针变量的值被置为NULL
B. 32位系统下任何类型指针的长度都是4个字节
C. 指针的数据类型声明的是指针实际指向内容的数据类型
D. 野指针是指向未分配或者已经释放的内存地址
正确答案:A
题解:
在我们free一个指针后,我们会释放该指针指向的那块在堆上申请的空间,但并不会值指针变量置为NULL;
四、 编程题题解
1、组队竞赛
思路:首先我们对选手水平值进行排序,我们每次取最大水平值、次大水平值与最小水平值为一组,这样可以组成平均水平值最大的排列;
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> v1;
// 避免多次扩容引起的时间消耗
v1.reserve(3 * n);
// 获取选手数据
for(int i = 0; i < 3 * n; i++)
{
int num;
cin >> num;
v1.push_back(num);
}
sort(v1.begin(), v1.end());
// 这里不能为int,因为,数据类型的范围是1到10的5次方
long long sum = 0;
int index = 3 * n - 2;
// 一次加上每组次大大数据
for(int i = 0; i < n; i++)
{
sum += v1[index];
index -= 2;
}
cout << sum << endl;
return 0;
}
2、删除公共字符
思路一:
使用STL库中的函数解决(效率不高)
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1, s2;
// 不可以用cin,因为输入数据可能存在空格
getline(cin, s1);
getline(cin, s2);
int pos = s1.find_first_of(s2);
while(pos != s1.npos)
{
s1.erase(pos, 1);
pos = s1.find_first_of(s2);
}
cout << s1 << endl;
}
不建议使用这种方法,效率不是很高,面试官看了也会觉得很没新意;
思路二:
使用map将第二个字符串中的每个字符记录下来,然后依次比较s1中每个字符;
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main()
{
string s1, s2;
getline(cin, s1);
getline(cin, s2);
string ret;
// 避免扩容引起的时间开销
ret.reserve(s1.size());
map<char, int> record_char;
// 记录到map中
for(auto& e : s2)
{
record_char[e]++;
}
// 依次与s1中字符比较
for(auto& e : s1)
{
if((record_char.find(e)) == record_char.end())
{
ret.push_back(e);
}
}
cout << ret << endl;
}
思路二与思路三中,没有使用erase,而是新创建一个string来接收,这是因为erase在中间位置的消耗太大了,这里不推荐;
思路三:
利用计数排序的思想,将第二个字符串映射到数组中;(完全手搓)
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1, s2;
getline(cin, s1);
getline(cin, s2);
string ret;
// 避免扩容引起的时间开销
ret.reserve(s1.size());
// 开数组一一映射
int count_char[256] = {0};
for(auto& e : s2)
{
count_char[e]++;
}
// 依次与s1中字符比较
for(auto& e : s1)
{
// 如果未曾映射过则push_back
if(count_char[e] == 0)
ret.push_back(e);
}
cout << ret << endl;
}