总言
主要内容:一些习题。
文章目录
- 总言
- 一、选择
- 1、for循环、操作符(逗号表达式)
- 2、格式化输出(转换说明符)
- 3、for循环、操作符(逗号表达式、赋值和判等)
- 4、if语句、操作符(自增自减、判等)
- 5、表达式求值(类型转换)
- 6、二维数组(数组初始化)
- 7、位操作符(按位或与非)
- 8、位移操作符、位操作符
- 9、运算符优先级
- 10、 指针概念理解
- 二、编程
- 2.1、组队竞赛
- 2.1.1、题目
- 2.1.2、题解:贪心
- 2.2、删除公共字符
- 2.2.1、题目
- 2.2.2、题解一:直接遍历查找删除
- 2.2.3、题解二:借助哈希
- Fin、共勉。
一、选择
1、for循环、操作符(逗号表达式)
以下for循环的执行次数是()
for (int x = 0, y = 0; (y = 123) && (x < 4); x++);
A 是无限循环
B 循环次数不定
C 4次
D 3次
相关知识链接:操作符详解
回答: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
回答:computer , com
相关说明:
3、for循环、操作符(逗号表达式、赋值和判等)
下列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
相关链接:for循环表达式
回答:i=j=k=0;
4、if语句、操作符(自增自减、判等)
下面程序输出是什么?
#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
考察:
①if语句中,else匹配原则:相关链接。
②逻辑运算符中的短路现象:相关链接。
回答:a=1 b=3 c=3(短路) d=0
5、表达式求值(类型转换)
若有定义语句: int a=10
; double b=3.14
; 则表达式 'A'+a+b
值的类型是()
A char
B int
C double
D float
考察了隐式类型转换(整型提升、算术转换):相关链接
回答:C
以下为寻常算术转换:(自下向上转换)
long double
double
float
unsigned long int
long int
unsigned int
int
6、二维数组(数组初始化)
下述p[1][2]的值是()
int p[][4] = {{1}, {3, 2}, {4, 5, 6}, {0}};
A 1
B 0
C 6
D 2
考察了二维数组的创建与初始化:相关链接。
回答:0。四行四列,行可以省略时花括号区分,值不够时默认为0。
7、位操作符(按位或与非)
选择表达式 11|10
的结果(本题数值均为十进制)()
A 11
B 10
C 8
D 2
相关链接。
回答:11。
8、位移操作符、位操作符
fun(21)运行结果是()
int fun(int a) {
a ^= (1 << 5) - 1;
return a;
}
A 10
B 5
C 3
D 8
相关链接。
回答:10。
9、运算符优先级
如下述定义语句,不能使变量 year
中的值增至 1010 的语句是()
int year=1009,*p=&year;
A *p+=1;
B (*p)++;
C ++(*p);
D *p++;
主要考察前置自增、后置自增、解引用操作符优先级相关链接。
回答:D。
10、 指针概念理解
下面关于"指针"的描述不正确的是()
A 当使用free释放掉一个指针内容后,指针变量的值被置为NULL
B 32位系统下任何类型指针的长度都是4个字节
C 指针的数据类型声明的是指针实际指向内容的数据类型
D 野指针是指向未分配或者已经释放的内存地址
A
解释:实际上,使用 free() 函数释放一个指针所指向的内存时,指针本身的值并不会被自动置为 NULL。free() 只负责释放内存,而不会修改指针的值。 因此,指针仍然会指向之前分配的内存地址,但这个地址现在可能已经被操作系统用于其他目的,所以访问这个地址可能会导致未定义行为,比如程序崩溃。为了避免这种情况,一种常见的做法是在调用 free() 之后手动将指针设置为 NULL。
二、编程
2.1、组队竞赛
2.1.1、题目
题源:链接
牛牛举办了一次编程比赛,参加比赛的有3*n
个选手,每个选手都有一个水平值a_i
。现在要将这些选手进行组队,一共组成n
个队伍,即每个队伍3人。牛牛发现队伍的水平值等于该队伍队员中第二高水平值。
例如:
一个队伍三个队员的水平值分别是3,3,3
。那么队伍的水平值是3。
一个队伍三个队员的水平值分别是3,2,3
。那么队伍的水平值是3。
一个队伍三个队员的水平值分别是1,5,2
。那么队伍的水平值是2。
为了让比赛更有看点,牛牛想安排队伍使所有队伍的水平值总和最大。如样例所示:
如果牛牛把6个队员划分到两个队伍
如果方案为:team1:{1,2,5}
、team2:{5,5,8}
,这时候水平值总和为7
。
而如果方案为:team1:{2,5,8}
, team2:{1,5,5}
, 这时候水平值总和为10
。
没有比总和为10更大的方案,所以输出10。
2.1.2、题解:贪心
说明: ①既然涉及到取较大值,先将输入的数据排序处理;②其次,让每次选值尽量取当前最大两值(由于最大的数不可能是中位数,所以退而求其次,取每组中第二大的);③这样,最终获取到的所有组中的水平值总和最大。
举例:
1 2 3 4 5 6 7 8 9
组1: 1 8 9 -->8;
组2: 2 6 7 -->6;
组3: 3 4 5 -->4;
中位数和:8、6、4.(当前最大)
下标关系:arr[arr.length-2*(i+1)]
arr.length=9;
i=0时,arr[7]=8;
i=1时,arr[5]=6;
i=2时,arr[3]=4;
i根据n值而定。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
//1、输入数据
long long n;//n个队伍
while (cin >> n) //OJ题,可能存在多组测试用例
{
vector<int> arr(3 * n);//3*n个选手
for (int i = 0; i < 3 * n; ++i)
{
cin >> arr[i];
}
//2、排序
std::sort(arr.begin(), arr.end());
//3、找每组水平值
long long sum = 0;//用于统计最后水平值总和。
for (int i = 0; i < n; ++i) {
sum += arr[arr.size() - (2 * (i + 1))];
}
cout << sum << endl;
}
return 0;
}
2.2、删除公共字符
2.2.1、题目
题源:链接
2.2.2、题解一:直接遍历查找删除
说明: 如下,根据s2中给定查找的字符串,遍历一遍s1,将满足s2中的字符删除。时间复杂度为
O
(
M
∗
N
2
)
O(M*N^2)
O(M∗N2) [ 遍历s1(n),erase挪位删除(n),遍历s2(m)。]
其它: 熟悉string类接口的使用。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1, s2;
getline(cin, s1);
getline(cin, s2);
int pos = 0;
for (size_t i = 0; i < s2.size(); ++i)
{
while ((pos = s1.find(s2[i])) != string::npos)
{
s1.erase(pos, 1);
}
}
cout << s1 << endl;
return 0;
}
2.2.3、题解二:借助哈希
说明:字符串一共256个,可以建立一个char类型的长度固定的数组来做哈希映射,该数组用来统计s2字符串中出现的字母的个数。遍历s1与该哈希数组比较,该数组中存在的值说明在s2中出现过。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1,s2;
getline(cin,s1);
getline(cin,s2);
string ret;
int hash[256] = {0};//使用哈希映射思想先统计s2中各字符出现的次数
for(size_t i = 0; i < s2.size(); ++i)
{
hash[s2[i]]++;
}
for(size_t i = 0; i < s1.size(); ++i)
{
if(hash[s1[i]] == 0)
ret += s1[i];
}
cout << ret << endl;
return 0;
}