描述
有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。
数据范围:序列长度和序列中的值都满足 1≤�≤501≤n≤50
输入描述:
第一行输入一个整数(0≤N≤50)。
第二行输入N个整数,输入用空格分隔的N个整数。
第三行输入想要进行删除的一个整数。
输出描述:
输出为一行,删除指定数字之后的序列。
示例3
输入:5
1 2 2 3 5
2
输出:1 3 5
代码展示:
#include <stdio.h>
#include <stdlib.h>
int deletsum(int arr[], int n, int flag) {
int i;
int count = 0;
for (i = 0; i < n; i++) {
if (arr[i] != flag) {
arr[count] = arr[i];
count++;
}
}
n = count;
return n;
}
int main() {
int n, flag;
scanf("%d", &n);
int* arr = (int*)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++) {
scanf("%d ", &arr[i]);
}
scanf("%d", &flag);
n=deletsum(arr, n, flag);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
free(arr);
return 0;
}
我的想法:
删除数组中指定的整数,同时保持剩余元素的相对顺序不变。
具体步骤如下:
- 输入序列的长度n和指定的整数flag。
- 动态分配一个大小为n的整型数组arr。
- 使用循环读取n个整数到数组arr中。
- 调用deletsum函数,传入数组arr、长度n和指定整数flag作为参数。
- 在deletsum函数中,遍历数组arr,将不等于flag的元素移动到数组的前部分,同时记录有效元素的个数count。
- 更新数组的长度n为count。
- 返回更新后的数组长度n。
- 在主函数中,使用循环打印数组arr中的元素,打印范围是从0到n-1。
- 释放动态分配的数组arr的内存。
- 返回0,表示程序执行成功。
在编写以上代码的过程中,我也遇到了一些小问题, 在刚开始定义deletsum函数时,我尝试通过更新参数
n
的值来改变序列的长度,但实际上这样是无效的,因为C语言中函数参数是按值传递的,对参数的修改不会影响到原来的变量。为了解决这个问题,我将
deletsum
函数的返回类型改为int
,并返回删除指定整数后的新序列的长度。然后在main
函数中更新变量n
的值,以反映出新序列的长度。
另一种方法来更新数组长度:
void deletesum(int arr[], int* n, int flag) {
int i, j;
int count = 0;
// 遍历数组,将不等于目标整数的元素前移
for (i = 0; i < *n; i++) {
if (arr[i] != flag) {
arr[count] = arr[i];
count++;
}
}
// 更新数组长度
*n = count;
}
在这段代码中,更新数组长度的用法是通过传递指向长度变量的指针来实现。
具体来说,主函数中的变量 n
是存储数组长度的整型变量。在调用 deletesum
函数时,传递了 &n
作为参数,即 deletesum(arr, &n, flag)
。在函数内部,通过修改 *n
的值来更新数组长度。例如,*n = count;
表示将指针 n
所指向的变量的值更新为 count
。由于 n
是指向主函数中变量 n
的指针,因此该操作实际上修改了主函数中的变量 n
的值,从而更新了数组的长度。