• 【C++刷题集】-- day3


    目录

    选择题

    单选

    OR59 字符串中找出连续最长的数字串⭐

    【题目解析】

    【解题思路】

    JZ39 数组中出现次数超过一半的数字⭐

    【题目解析】

    【解题思路1】

    【解题思路2】


    选择题

    单选

    1、以下程序的输出结果是 ( )

    1. #include
    2. int main()
    3. {
    4. char a[10] = { '1', '2', '3', '4', '5', '6', '7', '8', '9', 0 }, * p;
    5. int i;
    6. i = 8;
    7. p = a + i;
    8. printf("%s\n", p - 3);
    9. return 0;
    10. }
    6
    6789
    '6'
    789

    正确答案:


    解析:

    • %s:格式化打印是遇见 '\0'(0) 才会停止打印。

    ----------------------------------------------

    2、以下程序的输出结果是 ( )

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. int x = 3, y = 3;
    6. switch (x % 2)
    7. {
    8. case 1:
    9. switch (y)
    10. {
    11. case 0:
    12. cout << "first";
    13. case 1:
    14. cout << "second";
    15. break;
    16. default:
    17. cout << "hello";
    18. }
    19. case 2:
    20. cout << "third";
    21. }
    22. return 0;
    23. }
    second third
    hello
    first second
    hellothird

    正确答案:


    解析:

            根据x % 2 = 1匹配 case 1: ,根据y = 3匹配 default: ,于是会打印 "hello" 。但是此处我们需要注意,外层的switch语句的case : 是没有 break; 语句的,所以其会继续向下执行,然后执行case 2: ,再打印 "third" 。

            没有 break; 语句会一直执行到 break; 语句为止 / 结束。

    ----------------------------------------------

    3、 以下能对二维数组a进行正确初始化的语句是 ( )
    int a[2][] = {{0,1,2},{3,4,5}};
    int a[][3] = {{0,1,2},{3,4,5}};
    int a[2][4] = {{0,1,2},{3,4},{5}};
    int a[][3] = {{0,,2},{},{3,4,5}};

    正确答案:


    解析:

    二维数组再声明的时候,行可以省略,列是不可以省略的。

    :声明的是两行,但是初始化的时候,初始化的是三行。

    :初始化每一行的时候,必须连续的初始化,中间不能间隔。

    ----------------------------------------------

    4、 能把函数处理结果的二个数据返回给主调函数,在下面的方法中不正确的是 ( ) 
    return这二个数
    形参用数组
    形参用二个指针
    用二个全局变量

    正确答案:


    解析:

    return 每一次只能 return 一个数据类型,多个除非放到一个数组 / 一个容器里面。

    用数组的话,在调用这个函数的时候需要传递数组的地址,然后将函数处理的结果,放到这个数组中,然后函数调用完之后,就可以通过主调函数去访问数组来获取处理结果。

    用指针的话,在调用这个函数的时候需要传递两个地址变量,然后将对应的处理结果,放到地址的所属空间中,然后在函数调用完之后,主调函数通过两个指针去访问所属空间的值。

    全局变量的作用域是在整个源文件都是有效的,所以主调函数可以对其访问,以获取处理结果。

    ----------------------------------------------

    5、 int *p[4] 与选择项中的 ( ) 等价
    int p[4]
    int *p
    int *(p[4])
    int (*p)[4]

    正确答案:


    解析:

    • 题int *p[4]:[]的优先级是高于*的,所以p先和[]进行结合表示其是一个数组,然后数组里面存储的是int类型的指针 —— int类型的指针数组,元素个数为4

    int p[4]:int类型的数组,元素个数为4

    int *p:int类型的指针数组

    int *(p[4]):此时[]的优先级是高于*的,int类型的指针数组,元素个数为4

    int (*p)[4]:此时*的优先级是高于[]的,数组指针,元素个数为4,int类型

    ----------------------------------------------

    6、 设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是
    n=0; while(ch=getchar()!='\n') n++;
    n=0; while(getchar()!='\n') n++;
    for(n=0; getchar()!='\n'; n++);
    n=0; for(ch=getchar(); ch!='\n'; n++);

    正确答案:


    解析:

    while(ch=getchar()!='\n'):先getchar()获取一个字符,然后由于 != 优先级高于 '\n' ,所以,先进行 getchar()!='\n' 后再执行 ch = (getchar()!='\n'),虽然ch存在很奇怪,但是能计算。

    操作符优先级(详细说明+表格+问题表达式)_川入的博客-CSDN博客

    while(getchar()!='\n'):的简易版,能实现。

    for(n=0; getchar()!='\n'; n++):getchar()!='\n' 作为判断条件,此可以理解为与效果一样,能实现。

    for(ch=getchar(); ch!='\n'; n++):ch=getchar() 作为初始化部分,只有最开始的时候才会执行一次,所以是无法实现的,并且如果输入的第一个字符不是 '\n' 将会死循环。

    ----------------------------------------------

    7、 以下代码
    1. char* ptr;
    2. char myString[] = "abcdefg";
    3. ptr = myString;
    4. ptr += 5;
    代码执行之后ptr指向的内容是?
    Compiler error
    fg
    efg
    defg

    正确答案:


    解析:

            因为p指向的类型是char类型的。

    ----------------------------------------------

    8、 下面3段程序代码的效果一样吗()
    1. int b;
    2. (1)const int* a = &b;
    3. (2)int const* a = &b;
    4. (3)int* const a = &b;
    (2)=(3)
    (1)=(3)
    (1)=(2)
    都不一样

    正确答案:


    解析:

    • 常量指针:指针所指空间的值是不能发生改变的,不能通过指针解引用修改指针所指向的空间的值,但是指针的指向是可以发生改变的。
    • 指针常量:指针本身是一个常量,指针的指向不能发生改变,但是指针所指空间的值是可以发生的,可以通过指针解引用改变指针所指空间的值。
    • 区分:const与*的相对位置
      • const在*的左边 -- 常量指针
      • const在*的右边 -- 指针常量

    (1)常量指针

    (2)常量指针

    (3)指针常量

    ----------------------------------------------

    9、 32位系统中,定义int**a[3][4],则变量占用内存空间为()。
    4
    48
    192
    12

    正确答案:


    解析

            三行四列的一个数组,一共有 3 * 4 = 12 个元素。每一个元素都是int的二位指针类型,指针类型在32位系统中,是4个字节,于是:12 * 4 = 48。

    ----------------------------------------------

    10、 假设在一个 32 位 little endian 的机器上运行下面的程序,结果是多少?
    1. #include
    2. int main() {
    3. long long a = 1, b = 2, c = 3;
    4. printf("%d %d %d\n", a, b, c);
    5. return 0;
    6. }
    1,2,3
    1,0,2
    1,3,2
    3,2,1

    正确答案:


    解析:

    • 大端:低位存高地址,高位存低地址。
    • 小段:高位存高地址,低位存低地址。

     C语言整数存储_大小端_川入的博客-CSDN博客

    看题:

            long long类型是占8个字节,32 位 little endian 的机器。

            利用printf函数打印这三个变量的值,printf是一个库函数,在调用的时候,会创建一个函数栈帧。(栈:高地址向低地址增长)

            调用printf函数的时候,变量是从右到左入栈的(先c,再b,再a)。

            然后利用 %d 进行打印,每次获取4个字节内存的数据,然后根据后进先出的原则,依次向后4个字节,以转化为十进制打印。

            所以输出为:1 0 2

    ----------------------------------------------

    OR59 字符串中找出连续最长的数字串


    【题目解析】

            本题是一个很简单的题目,这里就不解析了。

    【解题思路】

            遍历字符串,使用str_tmp临时记录出现的数字片段,使用str_ret记录str_tmp临时出现的最长数字片段,最后返回str_ret。
    1. #include
    2. #include
    3. using namespace std;
    4. int main() {
    5. string str;
    6. cin >> str;
    7. string str_ret;
    8. string str_tmp;
    9. for(auto ch : str)
    10. {
    11. if(ch <= '9' && ch >= '0')
    12. str_tmp.push_back(ch);
    13. else
    14. {
    15. if(str_tmp.size() > str_ret.size()) str_ret = str_tmp;
    16. str_tmp.clear();
    17. }
    18. }
    19. if(str_tmp.size() > str_ret.size()) str_ret = str_tmp;
    20. cout << str_ret << endl;
    21. }

    JZ39 数组中出现次数超过一半的数字


    【题目解析】

            本题题意很简单,需要找出超过一半的那个数字,需要注意这个题是一个往年面试的热门题型。

    【解题思路1】

            数组排序后,如果符合条件的数存在,则一定是数组中间那个数。这种方法虽然容易理解,但由于涉及到快排sort,其时间复杂度为O(NlogN)并非最优。
    1. class Solution {
    2. public:
    3. int MoreThanHalfNum_Solution(vector<int> numbers) {
    4. if(numbers.empty()) return 0;
    5. sort(numbers.begin(), numbers.end());
    6. return numbers[numbers.size() / 2];
    7. }
    8. };

    【解题思路2】

            众数:就是出现次数超过数组长度一半的那个数字,如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数。
    1. class Solution {
    2. public:
    3. int MoreThanHalfNum_Solution(vector<int> numbers) {
    4. int result = numbers[0];
    5. int times = 1;
    6. int i = 1;
    7. for (int i = 1; i < numbers.size(); ++i)
    8. {
    9. if (times != 0)
    10. {
    11. if (numbers[i] == result) // 相同记录个数
    12. ++times;
    13. else // 不同消
    14. --times;
    15. }
    16. else // 前面的数全部消完,需要重新挨着再拿出一个数做标准
    17. {
    18. result = numbers[i];
    19. times = 1;
    20. }
    21. }
    22. return result;
    23. }
    24. };

    /

  • 相关阅读:
    nas连接萤石云摄像机CTQ6X
    迁移conda环境后,非root用户执行pip命令和jupyter命令报错/bad interpreter: Permission denied
    Spring 声明式事务控制
    前端样式获取
    Java 复习笔记 - 常见算法:API Arrays
    【踩坑系列】mysql 修改root密码失败
    嵌入式C语言自我修养基本概念考察(一)
    es 分组后排序 再分页
    自然语言处理从零到入门 BERT
    循环神经网络RNN基础《PyTorch深度学习实践》
  • 原文地址:https://blog.csdn.net/weixin_64609308/article/details/130713730