今日,笔者又刚刚练习了两道题,想波不急待的分享一下了!
1.有序序列插入一个整数:有序序列插入一个整数_牛客题霸_牛客网 (nowcoder.com)
2.序列中删除指定数字:序列中删除指定数字_牛客题霸_牛客网 (nowcoder.com)
1.有序序列插入一个整数
有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序。
输入描述:
第一行输入一个整数N(0≤N≤50)。
第二行输入N个升序排列的整数,输入用空格分隔的N个整数。
第三行输入想要进行插入的一个整数。
输出描述:
输出为一行,N+1个有序排列的整数。
示例1
输入:
5
1 6 9 22 30
8
输出:
1 6 8 9 22 30
下面请看笔者的代码:(错误)谨慎选择!仅供读者参考分析!
#include <stdio.h> int main() { int arr[50]={0}; int n=0; scanf("%d",&n); int i=0; for(i=0;i<n;i++) { scanf("%d",&arr[i]); } int k=0; scanf("%d",&k); int j=0; for(i=0;i<n;i++) { j=i; if(arr[j]<k) { printf("%d ",arr[j]); } else { printf("%d ",k); break; } } for(i=j;i<n;i++) { printf("%d ",arr[i]); } return 0; }
对于该代码确实通过了牛客网的调试阶段,但是对于正式的提交却是……尴尬了!
因此得出,笔者的代码还有稍微瑕疵!
笔者痛定思痛,最后想出了一个不错的代码,最后却是安然无恙的通过了,下面请看笔者的正确代码:
#include <stdio.h> int main() { int n = 0; int arr[51] = { 0 }; int k = 0; int i = 0; scanf("%d", &n); for (i = 0; i < n; i++) { scanf("%d", &arr[i]); } scanf("%d", &k); for (i = n - 1; i >= 0; i--) { if (arr[i] > k) { arr[i + 1] = arr[i]; } else { arr[i + 1] = k; break; } } if (i < 0) { arr[0] = k; } for (int i = 0; i < n + 1; i++) { printf("%d ", arr[i]); } return 0; }
这段代码,笔者是从大的数字往前面比较的!若是比k值大,则进行arr[i+1},若小于等于k,则进行arr[i+1]=k 的操作!若是在整个数组中,都没有比k大的数字,则就是arr[0]=k,然后在输出整个n+1个元素!
则代码的运算结果为:
2.序列中删除指定数字
描述
有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。
数据范围:序列长度和序列中的值都满足 1 \le n \le 501≤n≤50
输入描述:
第一行输入一个整数(0≤N≤50)。
第二行输入N个整数,输入用空格分隔的N个整数。
第三行输入想要进行删除的一个整数。
输出描述:
输出为一行,删除指定数字之后的序列。
示例1
输入:
6
1 2 3 4 5 9
4
输出:
1 2 3 5 9
示例2
输入:
5
1 2 3 4 6
5
输出:
1 2 3 4 6
笔者的代码为:
#include <stdio.h> int main() { int n = 0; scanf("%d", &n); int arr[50] = { 0 }; int i = 0; for (i = 0; i < n; i++) { scanf("%d", &arr[i]); } int k = 0; scanf("%d", &k); for (i = 0; i < n; i++) { if (arr[i] != k) { printf("%d ", arr[i]); } } return 0; }
在这个题目里面,没有多少的难度,其实主要的还是在于:
for (i = 0; i < n; i++) { if (arr[i] != k) { printf("%d ", arr[i]); } }
这段代码的思维!
若arr[i] != k,则进 printf("%d ", arr[i]); 因此笔者觉得读者也应该能够看懂,并且理解清楚,所以就不做过多的讲解!
请看笔者的最后代码运行结果:
到此暑假超越计划练习题(6),就已经结束!笔者坚持了六天!