欢迎来到笔试强训专栏
- (꒪ꇴ꒪(꒪ꇴ꒪ ),我是Scort
- 目前状态:大三非科班啃C++中
- 博客主页:张小姐的猫~江湖背景
- 快上车,握好方向盘跟我有一起打天下嘞!
- 送给自己的一句鸡汤:
- 真正的大师永远怀着一颗学徒的心
- 作者水平很有限,如果发现错误,可在评论区指正,感谢
- 欢迎持续关注!
笔试强训解析
- 欢迎来到笔试强训专栏
- 选择题
- 编程题
- 1️⃣不要二
- 2️⃣把字符串转换成整数
- 写在最后
选择题
十进制变量i的值为100,那么八进制的变量i的值为()
A 146
B 148
C 144
D 142
本题很简单:100除8,取余数,直到商为零,最后反向的串起余数即可
答案选C
执行下面语句后的输出为()
int I=1;if(I<=0)printf("****\n") ;elseprintf("%%%%\n");
A %%
B ****
C 有语法错,不能正确执行
D %%%%
printf(格式化,参数1,参数2,…)
格式化串:printf第一个参数之后的参数要按照上面格式打印
%d——> 按照整形方式打印
%f—— > 按照float方式打印格式串有一定的规定,%之后跟上特定的字符才代表一定的格式化
%Q——>无效的格式——>编译器会忽略%
printf(“%Q”) ;——>直接输出Q
printf(“%%%%\n”)可想而知输出的就是%%
答案是A
对于下面的C语言声明描述正确的一项是()
char (*p)[16]
A p是长度为16的字符指针数组
B p是包含16个字符的字符串
C p是指向长度为16的字符数组的指针
D p是长度为16的字符数组
- p是一个指针,指向的是长度为16的字符数组 也叫作数组指针
答案是C
数组a的定义语句为“float a[3][4];”,下列()是对数组元素不正确的引用方法
A a[i][ j]
B *(a[i]+j)
C ((a+i)+j)
D (a+i4+j)
a[i]
——>*(a+i)
—— 访问数组的a的第i个元素
二维数组a中的每个元素都是一个一维数组,很明显ABC都正确
答案选D
下面程序的输出结果是__________。
#include #define SQR(A) A*Avoid main() {int x=6,y=3,z=2;x/=SQR(y+z)/SQR(y+z);cout< < x< < endl;}
A 5
B 6
C 1
D 0
- 考察宏,在预处理阶段将宏展开
- 注意注意先全部替换了再运算,不要自己口算
x/=SQR(y+z)/SQR(y+z) ==x/=3+2 * 3+2 /3+2*3+2
按顺序算得出等于0
答案选D
当n=5时,下列函数的返回值是()
int foo(int n){if(n<2){return n;}elsereturn 2*foo(n-1)+foo(n-2);}
A 5
B 11
C 29
D 10
- 考察递归算法,画递归图算出f1、f2、f3等的数值,最后相加即可
答案选C
以下对C语言的”指针“描述不正确的是()
A 32位系统下任何类型指针的长度都是4个字节
B 指针的数据类型声明的是指针实际指向内容的数据类型
C 野指针是指向未分配或者已释放的内存地址
D 当使用free释放掉一个指针内容后,指针变量的值被置为NULL
int* p(int*)malloc(4); free(p)
free释放后,只是将p所在的内存空间释放了,并没有将p指针置为空,需要手动置空
数组定义为”int a[4][5];”, 引用”*(a+1)+2′′表示()(从第0行开始)
A a[1][0]+2
B a数组第1行第2列元素的地址
C a[0][1]+2
D a数组第1行第2列元素的值
- (a+1)表示数组a中第一个元素的地址
*(a+1)
表示数组a中第一个元素*(a+1)+2
是对一维数组后移两个单位;表示的是a数组第1行第2列元素的地址
答案选B
有一个如下的结构体:
struct A{long a1;short a2;int a3;int *a4;};
请问在64位编译器下用sizeof(struct A)计算出的大小是多少()
- 老对手了,结构体对齐
- 本题有疏漏,没有告诉是在什么平台下运行,vs下默认对齐数是8,linux下默认对齐数是4
答案选A
#include using namespace std;int f(int n){if (n==1)return 1;elsereturn (f(n-1)+n*n*n);}int main(){int s=f(3);cout<<s<<endl;return 0;}
运行结果是()
A 8
B 9
C 27
D 36
本题考查的是递归,f(3)= f(2)+333;f(2)=f(1)+222;f(1)=1;因此f(3)=1+222+333=36
因此答案选D
编程题
1️⃣不要二
题目地址:传送
解题思路:
- 任意两个蛋糕的欧几里得距离不能等于2
- 根据对公式的推导得知:如果
[i][j]
位置放了蛋糕,那么[i+2][j]
和[i][j+2]
的位置就不可以放蛋糕了 - 定义count计数,先把二维数组遍历初始化为1,把不能放的位置置为0,最后输出count的数值就是可以放的蛋糕数了
- 注意要防止
[i+2]
和[j+2]
的越界问题
#include #include using namespace std;int main() {int w, h;cin >> w >> h;vector<vector<int>> arr;arr.resize(w);for (auto& e : arr) { e.resize(h, 1);//初始值都置为1}int count =0;for (int i = 0; i < w; i++) {for (int j = 0; j < h; j++) {if (arr[i][j] == 1) { //不能放的位置置为0count++;if (i + 2 < w) {arr[i + 2][j] = 0;}if (j + 2 < h) {arr[i][j + 2] = 0;}}}}cout << count << endl;return 0;}
2️⃣把字符串转换成整数
题目链接:传送
解题思路:
- 考虑字符串是正、负、空的情况
- 怎么样把字符转换成数字呢?查看ascll码表可以得知:
'1' - '0' = 1
- 关键表达式:
sum = sum *10 + str[i] - '0'
- ps:+是会直接令sum=0,所以判断完是
+
or-
,就要置为零,也不影响下面的判断
class Solution {public:int StrToInt(string str) {if(str.empty()){return false;}int flag = 1;if(str[0] == '+'){flag = 1;str[0] = '0';//防止后面+进入不了循环所以置0}if(str[0] == '-'){flag = -1;str[0] = '0';}int sum = 0;for(int i = 0; i < str.size(); i++){//出现字母的情况if(str[i] < '0' || str[i] > '9'){sum = 0;break;}sum = sum*10 + str[i]-'0';}return flag * sum;}};
写在最后
星期三真不错