描述
有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。
数据范围:序列长度和序列中的值都满足 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 的值,从而更新了数组的长度。






















