目录
选择题
单选
编程题
组队竞赛⭐
【题目解析】
【解题思路】(排序 + 贪心)
删除公共字符⭐
【题目解析】
【解题思路】(哈希映射)
选择题
单选
for(int x = 0, y = 0; (y = 123) && (x < 4); x++);
正确答案:
解析:
- 初始化:为逗号表达式式,从左到右执行。
- 条件判断:为逻辑与需同真为真,y = 123赋值表达式,返回值为所赋的值 (y = 123) && (x < 4) -> (123恒为真) && (x < 4)。
- 调增x:0 -> 1 -> 2 -> 3。
- 循环语句:空语句。
----------------------------------------------
#include <stdio.h>
int main(void) {
printf("%s , %5.3s\n", "computer", "computer");
return 0;
}
正确答案:
解析:
- %s遇见 '\0' 就停止打印。
- %m.ns
- m:输出字符串的宽度。
- n:左起截取目标字符串n个字符。
- 字符串长度 > n > m:此时m的作用失效,是只受n的控制。
- m > n:是右对齐补空格。
- n > 字符串长度:作用与%s一样。
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;
}
正确答案:
解析:
- 初始化:为逗号表达式式,从左到右执行。
- 条件判断:j = 0赋值表达式,返回值为所赋的值0恒为假。
- 调增x:不执行。
- 循环语句:不执行。
#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;
}
正确答案:
解析:
后置++、后置--:先使用再++ / --。如:b++ == 2,是先进行b == 2的判断,判断完再进行++。
前置++、前置--:先++ / --再使用。如:++b == 2,是先进行++,++完再进行b == 2的判断。
||逻辑判断:有真即真,所以第一个为真,第二个的状态就不重要了,于是编译器会优化,不执行第二个(短路原则)。
&&逻辑判断:有假即假,所以第一个为假,第二个的状态就不重要了,于是编译器会优化,不执行第二个(短路原则)。
int a=10;
double b=3.14;
正确答案:
解析:
不同类型的表达式进行计算的时候,会有自动提升的过程,也就是说表示范围小的类型会自动提升为表示范围大的类型。如上:char类型 + int类型 + double类型,最终经过整形提升和算数转换,最终提升类型double类型。
表达式求值( 整形提升 + 算术转换 )_川入的博客-CSDN博客
int p[][4] = {{1}, {3, 2}, {4, 5, 6}, {0}};
中,p[1][2]的值是 ( )
正确答案:
解析:
二维数组:行可省略,列不可省略,未进行初始化部分默认为0。
正确答案:
解析:
11:0000 1011
10:0000 1010
11 | 10:0000 1011 = 11
( | 按位或:有1则1;& 按位或:有0则0)
int fun(int a) {
a ^= (1 << 5) - 1;
return a;
}
正确答案:
解析:
a ^= b:a = a ^ b。
1 << 5:0010 0000 = 32 = 0001 1111。
a = (21)^(31):(0001 0101) ^ ( 0001 1111) = 1010 = 10。
(^按位异或:异为1,同为0)
int year=1009,*p=&year;
以下不能使变量 year 中的值增至 1010 的语句是
( )
正确答案:
解析:
优先级:( ) > 后置++ > 前置++ > * > +=
操作符优先级(详细说明+表格+问题表达式)_川入的博客-CSDN博客
正确答案:
解析:
free释放掉一个指针内容后,只是销毁了指针所指向的空间,并不会将指针置NULL,此时指针指向一个被销毁的空间 -- 野指针。
- 常见的造成野指针的原因:
- 定义指针的时候为进行初始化。
- free释放掉指针后没有置NULL。
- 越界访问。
编程题
组队竞赛⭐
组队竞赛_牛客笔试题_牛客网 (nowcoder.com)
牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i。现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人。牛牛发现队伍的水平值等于该队伍队员中第二高水平值。
例如:
一个队伍三个队员的水平值分别是3,3,3.那么队伍的水平值是3
一个队伍三个队员的水平值分别是3,2,3.那么队伍的水平值是3
一个队伍三个队员的水平值分别是1,5,2.那么队伍的水平值是2
为了让比赛更有看点,牛牛想安排队伍使所有队伍的水平值总和最大。
【题目解析】
【解题思路】(排序 + 贪心)
- 排序 + 贪心算法:贪心算法就是每次选值时都选当前能看到的局部最解忧,所以这里的贪心就是保证每组的第二个值取到能选择的最大值就可以,我们每次尽量取最大,而尽量取最大就是最大的次极大。
- 例如:现在排序后有 1 2 5 5 8 9 ,那么分组为1 8 9 和 2 5 5。
所以我们再排除最大的情况下取次大。
于是中间值8最好,而左为小,越小越好。
贪心算法:只看局部最优解。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n = 0;
cin >> n;
vector<int> val(3*n, 0);
for (int i = 0; i < (3 * n); i++) cin >> val[i];
// 排序
sort(val.begin(), val.end());
// 所有队伍的水平值总和最大值
uint64_t ret = 0;
// 贪心
int right = 0;
int left = val.size() - 1;
for(;right < left; right++)
{
ret += val[left - 1];
left -= 2;
}
cout << ret << endl;
return 0;
}
删除公共字符⭐
删除公共字符_牛客题霸_牛客网 (nowcoder.com)
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”
【题目解析】
【解题思路】(哈希映射)
如果使用传统的暴力查找方式,滚动两个字符串,效率为O(N^2)太低了,很难让人满意抛弃解法,采用哈希映射更好。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
string str;
string sub;
// 注意这里不能使用cin接收,因为cin遇到空格就结束了。
// 使用string提供的getline
getline(cin, str);
getline(cin, sub);
// 使用哈希映射思想统计str中字符的出现
vector<int> hashtable(256,0);
for(int i = 0; i < sub.size(); i++) hashtable[sub[i]] = 1;
// 这里就不采取erase的方式(需要移动),采取利用空间换时间。
string str_ret;
for(int i = 0; i < str.size(); i++)
{
if(hashtable[str[i]] == 1)
continue;
str_ret.push_back(str[i]);
}
cout << str_ret << endl;
}