题解 | #有序序列合并#

有序序列合并

https://www.nowcoder.com/practice/a9e943b0dab142759807d0cfb6863897

思路

  1. 读入给定的两个升序数组中整数的个数a和b
  2. 创建整数数组num1[a],num2[b]
  3. 将两个升序数组存入数组num1和数组num2
  4. 创建最终数组num3[a+b]
  5. 循环:
  6. 条件:num1与num2下标不超过范围
  7. 执行语句:比较num1数组第 i 个整数与num2第 j 个整数大小,小的放入num3,相等时两个都放入num3
  8. 对应下标自增
  9. 2个循环:
  10. num1下标如果没超过范围,num1赋给num3,下标同时自增,用i++与k++
  11. num2同理
  12. 输出

知识点

  1. 见易错第1条
  2. num3[k++]=num1[i++],先将num1[i]赋给num3[k],然后k和i各自自增

易错

  1. 读入:使用scanf("%d",& )!=EOF时
  2. 我犯的错:以为读到换行符的时候会结束
  3. 实际知识:
  4. scanf的返回值是实际读入的项数,如果读取失败(文件结束符或读取错误),返回EOF
  5. != EOF 的含义是 "只要还没有遇到文件结束符,就继续循环",在终端输入情况下,EOF 通常通过按 Ctrl + D (Unix/Linux/Mac) 或 Ctrl + Z (Windows) 触发。
  6. 问题原因:
  7. scanf("%d ", &num1[i]) != EOF 在循环中无法正确处理**行结束**或**空白符**的边界情况。
  8. 空格 (" ") 在 scanf 中意味着跳过所有**空白字符**(包括**空格**、**制表符**、**换行符**等),这可能会导致它继续等待更多的输入,而不是结束当前循环。
  9. 代码梳理分析:7行,一直在等待输入,两个有序数组都读完了,只存入了a和b,12行再读入时,无输入,程序无法继续运行
  10. 解决:用while套住整个输入过程,scanf("%d %d",&a,&b)作条件,给了两个有序数组长度,就用长度限制来存入两个数组

刚开始写出的代码

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main() {
    int a, b;
    while (scanf("%d %d", &a, &b) != EOF) { // 注意 while 处理多个 case
        // 64 位输出请用 printf("%lld") to 

        int num1[a];
        int i = 0;
        while (scanf("%d ", &num1[i]) != EOF) {
            i++;
        }
        int num2[b];
        i = 0;
        while (scanf("%d ", &num2[i]) != EOF) {
            i++;
        }
        int num3[a + b];
        i = 0;
        int j = 0, k = 0;
        while (i < a && j < b) {
            if (num1[i] < num2[j]) {
                num3[k] = num1[i];
                i++;
                k++;
            }
            else if (num1[i] > num2[j]) {
                num3[k] = num2[j];
                j++;
                k++;
            }
            else if (num1[i] == num2[j]) {
                num3[k] = num1[i];
                i++;
                k++;
                num3[k] = num2[j];
                k++;
                k++;
            }
        }
        while (i < a) {
            num3[k++] = num1[i++];
        }
        while (j < b) {
            num3[k++] = num2[j++];
        }
        for (k = 0; k < a + b; k++) {
            printf("%d ", num3[k]);
        }
    }
    return 0;
}

改正错误后的代码

#include <stdio.h>

int main() {
    int a, b;
    while (scanf("%d %d", &a, &b) != EOF) {
        
        int num1[a];
        int num2[b];
        
        for(int i = 0; i < a; i++) {
            scanf("%d", &num1[i]);
        }
        for(int i = 0; i < b; i++) {
            scanf("%d", &num2[i]);
        }
        
        int num3[a + b];
        int i = 0, j = 0, k = 0;
        while(i < a && j < b) {
            if(num1[i] < num2[j]) {
                num3[k++] = num1[i++];
            } else if(num1[i] > num2[j]) {
                num3[k++] = num2[j++];
            } else {
                num3[k++] = num1[i++];
                num3[k++] = num2[j++];
            }
        }
        while(i < a) {
            num3[k++] = num1[i++];
        }
        while(j < b) {
            num3[k++] = num2[j++];
        }
        for(k = 0; k < a + b; k++) {
            if (k > 0) printf(" ");
            printf("%d", num3[k]);
        }
        printf("\n");
    }
    
    return 0;
}

全部评论

相关推荐

勤奋努力的椰子这就开摆:美团骑手在美团工作没毛病
投递美团等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务