• 笔试强训 Day6


    选择题

    1.十进制变量i的值为100,那么八进制的变量i的值为()
    A 146
    B 148
    C 144
    D 142

    本题很简单:100除8,取余数,直到商为零,最后反向的串起余数即可

    在这里插入图片描述

    2.执行下面语句后的输出为()

    1. int I=1;
    2. if(I<=0)
    3. printf("****\n") ;
    4. else
    5. printf("%%%%\n");

    A %%
    B ****
    C 有语法错,不能正确执行
    D %%%%

    3.对于下面的C语言声明描述正确的一项是()
    char (*p)[16]
    A p是长度为16的字符指针数组
    B p是包含16个字符的字符串
    C p是指向长度为16的字符数组的指针
    D p是长度为16的字符数组

    • p是一个指针,指向的是长度为16的字符数组 也叫作数组指针

    4.数组a的定义语句为“float a[3][4];”,下列()是对数组元素不正确的引用方法
    A a[i][ j]
    B *(a[i]+j)
    C *(*(a+i)+j)
    D (a+i*4+j)

    a[i]——> *(a+i) —— 访问数组的a的第i个元素
    二维数组a中的每个元素都是一个一维数组,很明显ABC都正确

    5.下面程序的输出结果是__________。

    1. #include < iostream.h>
    2. #define SQR(A) A*A
    3. void main() {
    4. int x=6,y=3,z=2;
    5. x/=SQR(y+z)/SQR(y+z);
    6. cout< < x< < endl;
    7. }

    A 5
    B 6
    C 1
    D 0

    • 考察宏,在预处理阶段将宏展开
    • 注意注意先全部替换了再运算,不要自己口算
      x/=SQR(y+z)/SQR(y+z) == x/=3+2 * 3+2 /3+2*3+2 =》x/=17=>x=6/17=0

    6.当n=5时,下列函数的返回值是()

    1. int foo(int n){
    2. if(n<2){
    3. return n;
    4. }
    5. else
    6. return 2*foo(n-1)+foo(n-2);
    7. }

    A 5
    B 11
    C 29
    D 10

    • 考察递归算法,画递归图算出f1、f2、f3等的数值,最后相加即可

    7.以下对C语言的”指针“描述不正确的是()
    A 32位系统下任何类型指针的长度都是4个字节
    B 指针的数据类型声明的是指针实际指向内容的数据类型
    C 野指针是指向未分配或者已释放的内存地址
    D 当使用free释放掉一个指针内容后,指针变量的值被置为NULL

    B.int* p   ----->p指向的是int类型的空间

    C.int* p(int*)malloc(4); free(p)

    free释放后,只是将p所在的内存空间释放了,并没有将p指针置为空,需要手动置空

    8.数组定义为”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列元素的地址

    9.有一个如下的结构体: 

    1. struct A{
    2. long a1;
    3. short a2;
    4. int a3;
    5. int *a4;
    6. };

    A.24

    B.28

    C.16

    D.18 

    • 本题有疏漏,没有告诉是在什么平台下运行,vs下默认对齐数是8,linux下默认对齐数是4在这里插入图片描述

    10.运行结果是()

    1. #include
    2. using namespace std;
    3. int f(int n){
    4. if (n==1)
    5. return 1;
    6. else
    7. return (f(n-1)+n*n*n);
    8. }
    9. int main(){
    10. int s=f(3);
    11. cout<
    12. return 0;
    13. }

    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

    编程题:

    不要二_牛客题霸_牛客网 (nowcoder.com)

    思路:

    在一个 W*H 的网格盒子中,最多可以放置多少块蛋糕的功能。下面是实现思路的解释:

    1. 首先,从输入中读取 W 和 H 的值,即网格盒子的宽度和高度。
    2. 创建一个二维向量 a,用于表示网格盒子,并将所有元素初始化为1。这里使用向量的向量来表示二维数组。
    3. 对二维数组进行遍历,从左上角开始,依次处理每个网格的位置。
    4. 如果当前网格中放置了蛋糕(即元素值为1),则将计数器 count 增加1,并且将当前网格右边和下面相邻的两个网格的元素值设置为0,表示这两个位置不能放置蛋糕。这样做的原因是,如果在当前位置放置了蛋糕,那么右边和下面相邻的两个位置就无法放置蛋糕,因为它们与当前位置的欧几里得距离为2。
    5. 完成对网格盒子的遍历后,输出计数器 count 的值,即最多可以放置的蛋糕数量。

    该实现思路通过遍历网格盒子的方式,按照一定规则放置蛋糕,以保证任意两块蛋糕之间的欧几里得距离不等于2。这样可以得到最多可以放置的蛋糕数量。代码中使用了向量的特性来表示二维数组,并且只遍历了一次网格盒子,所以时间复杂度为 O(W*H)。在这里插入图片描述

    代码实现:

    1. #include
    2. using namespace std;
    3. #include
    4. int main()
    5. {
    6. int W, H, count = 0;
    7. cin >> W >> H;
    8. //定义二维数组
    9. vectorint>> a;
    10. //确定行
    11. a.resize(W);
    12. //确定列
    13. for (auto& e : a)
    14. {
    15. //将每个元素初始化为1
    16. e.resize(H, 1);
    17. }
    18. for (int i = 0; i < W; i++)
    19. {
    20. for (int j = 0; j < H; j++)
    21. {
    22. if (a[i][j] == 1)
    23. {
    24. count++;
    25. if (i + 2 < W)
    26. {
    27. a[i + 2][j] = 0;
    28. }
    29. if (j + 2 < H)
    30. {
    31. a[i][j + 2] = 0;
    32. }
    33. }
    34. }
    35. }
    36. cout << count << endl;
    37. }

     把字符串转换成整数__牛客网 (nowcoder.com)

     代码实现1:

    1. class Solution {
    2. public:
    3. int StrToInt(string str) {
    4. if (str.empty()) {
    5. return 0; // 如果字符串为空,返回0
    6. }
    7. int flag = 1; // 标志位,用于记录正负号,默认为正数
    8. if (str[0] == '-') {
    9. flag = -1; // 如果第一个字符是负号,将标志位设置为-1
    10. str[0] = '0'; // 将负号替换为0,便于后续转换
    11. }
    12. else if (str[0] == '+') {
    13. flag = 1; // 如果第一个字符是正号,将标志位设置为1
    14. str[0] = '0'; // 将正号替换为0,便于后续转换
    15. }
    16. int sum = 0; // 用于累加转换后的结果
    17. for (int i = 0; i < str.size(); i++) {
    18. if (str[i] < '0' || str[i] > '9') {
    19. sum = 0; // 如果遇到非数字字符,则将结果置为0
    20. break;
    21. }
    22. else {
    23. sum = sum * 10 + str[i] - '0'; // 将字符转换为数字,并累加到结果中
    24. }
    25. }
    26. return flag * sum; // 返回带符号的结果
    27. }
    28. };

    实现2:

    1. #include
    2. using namespace std;
    3. class Solution {
    4. public:
    5. int StrToInt(string str) {
    6. if (str.empty()) {
    7. // 返回0或者抛出异常,表示输入为空字符串
    8. return 0;
    9. }
    10. int flag = 1;
    11. int sum = 0;
    12. int i = 0;
    13. if (str[0] == '+') {
    14. flag = 1;
    15. i++;
    16. } else if (str[0] == '-') {
    17. flag = -1;
    18. i++;
    19. }
    20. for (; i < str.size(); i++) {
    21. if (str[i] < '0' || str[i] > '9') {
    22. // 非数字字符,返回0或者抛出异常,表示输入非法
    23. return 0;
    24. }
    25. sum = sum * 10 + (str[i] - '0');
    26. }
    27. return sum * flag;
    28. }
    29. };

  • 相关阅读:
    canvas 中如何实现物体的框选(六)
    什么是web3.0?
    .gitignore 文件
    CORS 跨域访问, 实现跨域的原理, CORS漏洞利用
    计算机毕业设计(附源码)python足球新闻发布管理系统
    Linux CentOS 8(HTTPS的配置与管理)
    电脑桌面文件不见了怎么恢复?4个方法!(详细步骤分享)
    [HDLBits] Countbcd
    C#基于SkiaSharp实现印章管理(2)
    Unity下载资源且保存
  • 原文地址:https://blog.csdn.net/weixin_67916525/article/details/130855234