题解 | #有序序列合并#
有序序列合并
https://www.nowcoder.com/practice/a9e943b0dab142759807d0cfb6863897
思路
- 读入给定的两个升序数组中整数的个数a和b
- 创建整数数组num1[a],num2[b]
- 将两个升序数组存入数组num1和数组num2
- 创建最终数组num3[a+b]
- 循环:
- 条件:num1与num2下标不超过范围
- 执行语句:比较num1数组第 i 个整数与num2第 j 个整数大小,小的放入num3,相等时两个都放入num3
- 对应下标自增
- 2个循环:
- num1下标如果没超过范围,num1赋给num3,下标同时自增,用i++与k++
- num2同理
- 输出
知识点
- 见易错第1条
- num3[k++]=num1[i++],先将num1[i]赋给num3[k],然后k和i各自自增
易错
- 读入:使用scanf("%d",& )!=EOF时
- 我犯的错:以为读到换行符的时候会结束
- 实际知识:
- scanf的返回值是实际读入的项数,如果读取失败(文件结束符或读取错误),返回EOF
!= EOF
的含义是 "只要还没有遇到文件结束符,就继续循环",在终端输入情况下,EOF 通常通过按Ctrl + D
(Unix/Linux/Mac) 或Ctrl + Z
(Windows) 触发。- 问题原因:
scanf("%d ", &num1[i]) != EOF
在循环中无法正确处理**行结束**或**空白符**的边界情况。- 空格 (
" "
) 在scanf
中意味着跳过所有**空白字符**(包括**空格**、**制表符**、**换行符**等),这可能会导致它继续等待更多的输入,而不是结束当前循环。 - 代码梳理分析:7行,一直在等待输入,两个有序数组都读完了,只存入了a和b,12行再读入时,无输入,程序无法继续运行
- 解决:用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; }