• 每日刷题-2


    目录

    一、选择题

    二、编程题

    1、倒置字符串

    2、排序子序列

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

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



    一、选择题

    1、

    题目解析:

    二维数组初始化的一般形式是:

    数据类型 数组名[常量表达式1][常量表达式2] = {初始化数据};

    其中,常量表达式1和常量表达式2分别表示数组的行数和列数,初始化数据用花括号括起来,每一行的数据用逗号分隔,每一行的末尾可以加上分号。如果初始化数据的个数少于数组的元素个数,那么剩余的元素会被自动赋值为0。如果省略常量表达式1,那么编译器会根据初始化数据的个数自动推断出数组的行数。如果省略常量表达式2,那么编译器会报错。故答案为B。

    2、

    题目解析:(1)使用return语句返回一个包含多个值的结构体或者数组;

    (2)使用指针或者引用作为函数的形参,通过修改指针或者引用指向的变量来返回多个值;

    (3)使用静态变量或者全局变量来存储多个返回值,然后在主调函数中访问它们。

    其中,第一种方法和第二种方法是比较常见和推荐的,因为它们可以保证函数的封装性和可重用性,也可以避免潜在的错误和冲突。第三种方法是不建议使用的,因为它会破坏函数的封装性和可重用性,也会增加程序的复杂度和维护成本。

    3、

    题目解析:int *p[4].是一个指针数组..它表示一个含有4个元素的数组每个元素都是一个指向int类型的指针。由于“[]”的优先级高于“*”,所以p先和“[]”结合再和“*”结合,所以答案为C。

    4、

    题目解析:long long类型在32位机器上占用8个字节,也就是64位1;little endian表示低位字节存放在低地址,高位字节存放在高地址。当printf函数打印一个long long类型的变量时,它会把这个变量的8个字节分成两个4字节的部分,然后从低地址处开始读取第一个部分,再读取第二个部分。每个部分都可以看作一个int类型的数。因此,变量a的值为1,在内存中的存储方式为01 00 00 00 00 00 00 00,其中01是低位字节,存放在低地址处。当printf函数打印a时,它会从低地址处开始读取4个字节,也就是01 00 00 00,转换为十进制就是1。注意了,此时a还有4个字节没有被读取,打印b的时候,变量b的值为2,在内存中的存储方式为02 00 00 00 00 00 00 00,其中02是低位字节,存放在低地址处。当printf函数打印b时,它会从低地址处开始读取4个字节,也就是02 00 00 00,但是因为前面的4个字节,所以02变成了第五个字节,所以打印出来是0变量c的值为3,在内存中的存储方式为03 00 00 00 00 00 00 00,其中03是低位字节,存放在低地址处。当printf函数打印c时,它会从低地址处开始读取4个字节,也就是03 00 00 00,转换为十进制就是2。这是因为03是第9个字节,而不是第一个字节,所以它的权值为2。

    二、编程题

    1、倒置字符串

    分析题目:先将整个字符串逆置过来,再遍历字符串,找出每个单词,对单词逆置。这里我们使用了stl算法中的reverse,所以这里使用迭代器遍历string。

    代码如下:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main() {
    6. string str;
    7. while (getline(cin, str)) {
    8. reverse(str.begin(), str.end()); //整体逆置
    9. auto start = str.begin();
    10. while (start != str.end()) {
    11. auto end = start;
    12. while (*end != ' ' && *end != '\0') {
    13. end++;
    14. }
    15. reverse(start, end);
    16. if (end != str.end())
    17. start = end + 1;
    18. else
    19. start = end;
    20. }
    21. cout << str << endl;
    22. }
    23. }

    知识点:begin()函数返回一个迭代器,指向字符串的第一个元素。例如,如果有一个字符串string str= "He11o";,那么str.begin()就指向'H’这个字符。end()函数返回一个迭代器,指向字符串的末尾(最后一个字符的下一个位置)。例如,如果有一个字符串string str = "Hello";,那么str.end()就指向'\0’这个空字符,它是字符串的结束标志。这两个函数的范围是左闭右开的,也就是说,它们包含了字符串的第一个元素,但不包含最后一个元素

    reverse 函数的范围是左闭右开的,也就是说,它包含了start指向的元素,但不包含指向end的元素。这个范围可以用中括号表示为[start,end)。例如,如果有一个数组int arr [] = (1,2,3,4,5};,那么reverse (arr + 1, arr + 4);就会翻转数组索引[1,4)的区域,也就是2,3,4这三个元素,翻转后的数组变为{1,4,3,2,5}。

    2、排序子序列

    题目分析:非递减就是a[i]<=a[i+1],递减就是a[i]>a[i+1],非递增就是a[i]>=a[i+1],递增就是a[i]

    • 首先,我们需要定义一个flag变量,用来记录当前的排序状态,初始值为0。如果flag为0,表示还没有确定排序状态;如果flag为1,表示当前是非递减排序;如果flag为-1,表示当前是非递增排序。
    • 然后,我们遍历数组A,比较相邻的两个元素的大小关系。如果A[i] < A[i+1],表示当前是升序;如果A[i] > A[i+1],表示当前是降序;如果A[i] == A[i+1],表示当前没有变化。
    • 接下来,我们根据flag的值和当前的大小关系来判断是否需要分割子序列。如果flag为0,表示还没有确定排序状态,那么我们就根据当前的大小关系来更新flag的值,并且不需要分割子序列。如果flag为1,表示当前是非递减排序,那么我们就判断当前是否是降序,如果是降序,那么我们就需要分割子序列,并且把flag的值更新为-1;如果不是降序,那么我们就不需要分割子序列。如果flag为-1,表示当前是非递增排序,那么我们就判断当前是否是升序,如果是升序,那么我们就需要分割子序列,并且把flag的值更新为1;如果不是升序,那么我们就不需要分割子序列。
    • 最后,我们统计分割出来的子序列的个数,就是最少可以把数组A分为几段排序子序列的答案
    • 代码如下:
    1. #include
    2. #include
    3. using namespace std;
    4. int main() {
    5. int n = 0;
    6. while (cin >> n) {
    7. vector<int> list;
    8. int count = 1;
    9. int flag = 0;
    10. list.resize(n);
    11. for (int i = 0; i < n; i++) {
    12. cin >> list[i];
    13. }
    14. for (int i = 0; i < n - 1; i++) {
    15. if (flag == 0)
    16. {
    17. if (list[i] == list[i + 1])continue;
    18. else if (list[i] < list[i + 1])
    19. flag = 1;
    20. else
    21. flag = -1;
    22. }
    23. else if (flag == 1)
    24. {
    25. if (list[i] > list[i + 1])
    26. {
    27. count++;
    28. flag = 0;
    29. }
    30. } else
    31. {
    32. if (list[i] < list[i + 1])
    33. {
    34. count++;
    35. flag = 0;
    36. }
    37. }
    38. }
    39. cout << count << endl;
    40. }
    41. }

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

    题目分析:遍历字符串,使用cur去记录连续的数字串,如果遇到不是数字字符,则表示一个连续的数字串结束了,则将数字串跟之前的数字串比较,如果更长,则更新更长的数字串更新到res。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main() {
    6. string str, res, cur;
    7. cin>>str;
    8. for (int i = 0; i < str.length()+1; i++)
    9. {
    10. if (str[i] >= '0' && str[i] <= '9')
    11. {
    12. cur += str[i];
    13. }
    14. else {// 找出更长的字符串,则更新字符串
    15. if (res.size() < cur.size())
    16. res = cur;
    17. else
    18. cur.clear();
    19. }
    20. }
    21. cout<
    22. }

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

    题目分析:

    思路一:数组排序后,如果符合条件的数存在,则一定是数组中间那个数。这种方法虽然容易理解,但由于涉及到快排sort,其时间复杂度为O(NlogN)并非最优;

    1. lass Solution {
    2. public:
    3. int MoreThanHalfNum_Solution(vector<int>& numbers) {
    4. sort(numbers.begin(), numbers.end());
    5. int middle = numbers[numbers.size() / 2];
    6. int count = 0; // 出现次数
    7. for (int i = 0; i < numbers.size(); ++i) {
    8. if (numbers[i] == middle) ++count;
    9. }
    10. return (count > numbers.size() / 2) ? middle : 0;
    11. }
    12. };

    思路二:就是出现次数超过数组长度一半的那个数字
    如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数。

    1. class Solution {
    2. public:
    3. int MoreThanHalfNum_Solution(vector<int>& numbers)
    4. {
    5. int times=1;
    6. int result=numbers[0];
    7. for(int i=1;isize();i++)
    8. {
    9. if(numbers[i]!=result)
    10. {
    11. if(times==0)
    12. {
    13. result=numbers[i];
    14. }
    15. else
    16. {
    17. times--;
    18. }
    19. }
    20. else {
    21. times++;
    22. result=numbers[i];
    23. }
    24. }
    25. return result;
    26. }
    27. };

  • 相关阅读:
    1592 例题1 国王(Sgu223 LOJ10170 LUOGU1896 提高+/省选-) 暴力思考 状压DP 01背包
    【附源码】计算机毕业设计JAVA智能社区管理系统
    java计算机毕业设计干洗店订单管理系统设计与实现MyBatis+系统+LW文档+源码+调试部署
    Speedoffice(excel)文档中min函数如何使用
    手写Spring1(实现Spring bean容器)
    上海再发区块链专项方案 和数集团欲打造新一代Web3.0创新生态
    Spring-Cloud GateWay+Vue 跨域方案汇总
    应急响应-web
    k8s单master--测试环境集群搭建
    基于springboot实现福聚苑社区团购平台系统项目【项目源码】
  • 原文地址:https://blog.csdn.net/weixin_65592314/article/details/132722246