一. 单选
1.以下for循环的执行次数是()
for(int x = 0, y = 0; (y = 123) && (x < 4); x++);
A 是无限循环
B 循环次数不定
C 4次
D 3次
正确答案:C
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
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;所以不会进入循环
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
从第一个else开始,与它最近的if结合...
5.若有定义语句: int a=10 ; double b=3.14 ; 则表达式 'A'+a+b 值的类型是()
A char
B int
C double
D float
正确答案:C
char类型和int类型会整形提升为double类型
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
| :按位或,有1为1
8.
int fun(int a){
a^=(1<<5)-1;
return a;
}
fun(21)运行结果是()
A 10
B 5
C 3
D 8
正确答案:A
^ :异或 相同为0,相异为1
<<:左移位 左边抛弃,右边补0
>>:右移位 算数移位->左边用该值的符号位填充,右边丢弃
逻辑移位->左边补0,右边抛弃
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
A:free只是释放空间,需要手动置空,否则可能出现野指针问题
B:32位系统下,指针是4个字节;64位系统下,指针是8个字节
D:造成野指针的一些原因:
1、定义指针的时候未初始化
2、free之后没有将指针置空
3、越界访问
二、编程
100449-组队竞赛
牛牛举办了一次编程比赛,参加比赛的有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.
【题目解析】:
队伍的水平值等于该队伍队员中第二高水平值,为了所有队伍的水平值总和最大的解法,也就是说每个队伍的第二个值是尽可能大的值。所以实际值把最大值放到最右边,最小是放到最左边。
【解题思路】:
本题的主要思路是贪心算法,贪心算法其实很简单,就是每次选值时都选当前能看到的局部最解忧,所以这里的贪心就是保证每组的第二个值取到能选择的最大值就可以,我们每次尽量取最大,但是最大的数不可能是中位数,所以退而求其次,取 每组中第二大的
例如 现在排序后 有 1 2 5 5 8 9 ,那么分组为1 8 9 和 2 5 5
关系arr[arr.length-2*(i+1)]
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
// IO型OJ可能会有多组测试用例,所以这里要持续接收输入多组测试用例。
int n;
while (cin >> n) {
long long sum = 0;
vector<int> a;
a.resize(3 * n);
for (int i = 0; i < (3 * n); i++) {
cin >> a[i];
}
std::sort(a.begin(), a.end());
for (int i = 0; i < n; i++) {
sum += a[a.size() - (2 * (i + 1))];
}
cout << sum << endl;
}
}
69390-删除公共字符
链接:https://www.nowcoder.com/practice/f0db4c36573d459cae44ac90b90c6212?tpId=85&&tqId=29868&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking
描述
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”
输入描述:
每个测试输入包含2个字符串
输出描述:
输出删除后的字符串
【解题思路】:
本题如果使用传统的暴力查找方式,如判断第一个串的字符是否在第二个串中,在再挪动字符删除这个字符的方式,效率为O(N^2),效率太低,很难让人满意。
1. 将第二个字符串的字符都映射到一个hashtable数组中,用来判断一个字符在这个字符串。
2. 判断一个字符在第二个字符串,不要使用删除,这样效率太低,因为每次删除都伴随数据挪动。这里可
以考虑使用将不在字符添加到一个新字符串,最后返回新新字符串。
#include<iostream>
#include<string>
using namespace std;
int main() {
// 注意这里不能使用cin接收,因为cin遇到空格就结束了。
// oj中IO输入字符串最好使用getline。
string str1, str2;
//cin>>str1;
//cin>>str2;
getline(cin, str1);
getline(cin, str2);
// 使用哈希映射思想先str2统计字符出现的次数
int hashtable[256] = {0};
for (size_t i = 0; i < str2.size(); ++i) {
hashtable[str2[i]]++;
}
// 遍历str1,str1[i]映射hashtable对应位置为0,则表示这个字符在
// str2中没有出现过,则将他+=到ret。注意这里最好不要str1.erases(i)
// 因为边遍历,边erase,容易出错。
string ret;
for (size_t i = 0; i < str1.size(); ++i) {
if (hashtable[str1[i]] == 0)
ret += str1[i];
}
cout << ret << endl;
return 0;
}