🌈选择题
1.以下for循环的执行次数是()
for(int x = 0, y = 0; (y = 123) && (x < 4); x++);
A.是无限循环
B.循环次数不定
C.4次
D.3次
复习一下for循环(初始化部分;条件判断部分;调整部分){}
注意注意!! y=123是赋值 为真的(看清楚)后面就是剩下x = 0、1、2、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
说实话做题才能查漏补缺,我们知道%s遇到\0就停止打印。是这个%5.3s 我没见过,下面来科普一下
% m.ns:
m : 输出字符串的宽度
n :左起截止目标字符串的n个字符,而且是右对齐,左边不够补空格
当字符串 > n > m :此时m的作用失效了,直接截取n
当n > 字符串 :作用和%s一样,遇到\0就停止
所以%5.3s 输出的是 com(com前面两个空格),答案选C
下列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循环执行了多少次?
有了上面一题的基础再判断,应该不难
这里的条件判断部分j = 0恒为假,不会进入循环所以K不会++,K等于0,答案选B
下面程序输出是什么?
#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
吐槽一下,上面的代码很乱,且省略了{},像极了我刚开始的样子
但是else有就近匹配原则 : 匹配最近的if
|| 逻辑或:任意一方为真,挡路原则: 左边表达式为真,右边表达式就不会执行
第一个if就判断为假,直接到最后一个printf 打印,答案是 : D
若有定义语句: int a=10 ; double b=3.14 ; 则表达式 ‘A’+a+b 值的类型是()
A.char
B.int
C.double
D.float
知识复习:
'A’是char类型,占一个字节,范围是-128 ~ 127
a是int 类型, 占4个字节,范围是 -21亿 ~ 21亿
c是double类型,占8个字节,范围是2.310的308次方 ~ 1.710的308次方
不同类型运算会自动提升,小范围-> 大范围 最后转换为double类型,答案选C
下面,p[1][2]的值是()
int p[][4] = {{1}, {3, 2}, {4, 5, 6}, {0}};
A.1
B.0
C.6
D.2
每个大括号是一行,都没有进行完全初始化,没初始化的默认为0
数组坐标从0开始,看图 所以答案是B
选择表达式 11|10 的结果(本题数值均为十进制)()
A.11
B.10
C.8
D.2
简单的逻辑运算
所以答案选A
int fun(int a){ a^=(1<<5)-1; return a; }
fun(21)运行结果是()
A.10
B.5
C.3
D.8
此处要注意:1<<5 后等于32 ,再-1 等于31, 最后是a^31 也就是21^31
^ : 相等为0 ,相异为1
答案是A
若有定义语句:int year=1009,*p=&year;以下不能使变量 year 中的值增至 1010 的语句是()
A.*p+=1;
B.(*p)++;
C.++(*p)
D.*p++
考察的是运算符优先级的问题,忘了要多复习复习
得知 *的优先级大于 +=,()的优先级比++高,唯独++的优先级比*要高,没有对1009进行++,而是对指针++.
毫无疑问 ,答案选D
下面关于"指针"的描述不正确的是()
A.当使用free释放掉一个指针内容后,指针变量的值被置为NULL
B.32位系统下任何类型指针的长度都是4个字节
C.指针的数据类型声明的是指针实际指向内容的数据类型
D.野指针是指向未分配或者已经释放的内存地址
解析:
A:free指针只是把指向的空间销毁了 ,指针的值置空是要我们手动置空
ps:造成野指针的三大原因
定义时,没有初始化
free掉后,没有置空
越界访问使用指针
答案选A
🌈编程题
1️⃣组队竞赛
题目链接:组队竞赛
思路讲解:
首先对数据进行排序
推导出下标满足的公式 arr.len - 2*(i+1),满足最大水平和
算法的头文件记不住 algorithm algorithm algorithm
代码如下
#include<iostream> #include<algorithm> #include<vector> using namespace std; int main() { long long sum = 0; int n; cin>>n; 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; return 0; }
2️⃣删除公共字符
题目地址:添加链接描述
讲解两种思路:哈希 & 暴力
首先是哈希
遍历这个str2字符串,把对应的字符放到hash[ ]中
遍历str1,找到hash中等于 0 的(也就是没有重复的 )
暴力法:
去str1里面找str2的值,find找到相同的就erase
//哈希 #include <iostream> #include <string> using namespace std; int main() { string str1, str2; //cin>>str1;//cin遇到空格就停止 getline(cin, str1); getline(cin, str2); int hash[256] = {0}; for(int i = 0; i < str2.size(); i++) { hash[str2[i]]++; } string end =""; for(int i = 0; i < str1.size(); i++) { if(hash[str1[i]] == 0)//==0的就是不相同的 { end += str1[i]; } } cout<<end<<endl; return 0; }
#include <iostream> #include <string> using namespace std; //暴力 int main() { string s1,s2; getline(cin,s1); getline(cin,s2); for(int i = 0;i < s2.size(); i++) { while(s1.find(s2[i]) != -1)//find找不到就返回npos(-1) !=也就是找到了 { s1.erase(s1.find(s2[i]),1); } } cout<<s1<<endl; return 0; }