鱼C论坛

 找回密码
 立即注册
查看: 1177|回复: 5

[已解决]删除数组0元素

[复制链接]
发表于 2021-10-28 10:36:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
从键盘读入n个整数放入数组中,编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移动。注意,CompactIntegers函数需要接受数组及其元素个数作为参数,函数返回值应为删除操作执行后数组的新元素个数。输出删除后数组中元素的个数并依次输出数组元素。
样例输入: (输入格式说明:5为输入数据的个数,3 4 0 0 2 是以空格隔开的5个整数)
5
3 4 0 0 2
样例输出:(输出格式说明:3为非零数据的个数,3 4 2 是以空格隔开的3个非零整数)
3
3 4 2
样例输入:
7
0 0 7 0 0 9 0
样例输出:
2
7 9
样例输入:
3
0 0 0
样例输出:
0
<#include<stdio.h>
int a[1005]={0};
int m;
int compactintegers(int c)
{
        int i,j;
        for(i=0;i<c;i++)
        {
                if(a[i]==0)
                {
                        a[i]=a[i+1];m--;
                }
        }
        return m;
}
int main()
{
        int n,i;
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
                scanf("%d",&a[i]);
        }
        m=n;
    m=compactintegers(n);
        printf("%d\n",m);
        for(i=0;i<m;i++)
        {
                printf("%d ",a[i]);
        }
        return 0;
}>
样例输出是3
3 4 0
请问哪里有问题
最佳答案
2021-10-28 11:01:43
if(a[i]==0)
{
   a[i]=a[i+1];m--;
}
问题出在这里,这里只考虑了一种情况就是0,7这样的  把7前移到0的位置  但是第一个例子的0 0 2部分就会变成0 2
提供一种思路
#include<stdio.h>
int a[1005] = { 0 };
int m;
int compactintegers(int c)
{
        int i, j = 0;
        for (i = 0; i<c; i++)
        {
                if (a[i] == 0)
                {
                        m--;
                }
                else
                {
                        a[j] = a[i];
                        j++;
                }
        }
        return m;
}
int main()
{
        int n, i;
        scanf("%d", &n);
        for (i = 0; i<n; i++)
        {
                scanf("%d", &a[i]);
        }
        m = n;
        m = compactintegers(n);
        printf("%d\n", m);
        for (i = 0; i<m; i++)
        {
                printf("%d ", a[i]);
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-28 11:01:43 | 显示全部楼层    本楼为最佳答案   
if(a[i]==0)
{
   a[i]=a[i+1];m--;
}
问题出在这里,这里只考虑了一种情况就是0,7这样的  把7前移到0的位置  但是第一个例子的0 0 2部分就会变成0 2
提供一种思路
#include<stdio.h>
int a[1005] = { 0 };
int m;
int compactintegers(int c)
{
        int i, j = 0;
        for (i = 0; i<c; i++)
        {
                if (a[i] == 0)
                {
                        m--;
                }
                else
                {
                        a[j] = a[i];
                        j++;
                }
        }
        return m;
}
int main()
{
        int n, i;
        scanf("%d", &n);
        for (i = 0; i<n; i++)
        {
                scanf("%d", &a[i]);
        }
        m = n;
        m = compactintegers(n);
        printf("%d\n", m);
        for (i = 0; i<m; i++)
        {
                printf("%d ", a[i]);
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-28 11:05:06 | 显示全部楼层
注意,CompactIntegers函数需要接受数组及其元素个数作为参数

不按照题目要求写代码,就算是输出结果正确,估计也不会得分吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-28 11:16:31 | 显示全部楼层
问题出在你返回的m只是表示了有多少个为0的值,并不能说明非零值的位置,所以直接打印前m条是不对的
参考代码
#include<stdio.h>
int a[1005]={0};
int b[1005]={0};
int m;
int j=0;
int compactintegers(int c)
{
        int i;
        for(i=0;i<c;i++)
        {
                if(a[i]==0)
                {
                        a[i]=a[i+1];m--;
                }
                else{
                              b[j] = i;
                              j++;
                     }
        }
        return m;
}
int main()
{
        int n,i;
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
                scanf("%d",&a[i]);
               
        }
        m=n;
        m=compactintegers(n);
        printf("%d\n",m);
        for(i=0;i<j;i++)
       {
               int k=0;
               k = b[i];
                printf("%d ",a[k]);
       }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-28 11:22:39 | 显示全部楼层
按照题目要求写代码
#include <stdio.h>

size_t CompactIntegers(int array[], size_t size) {
    for(size_t i = 0; i < size; ++i) {
        if(!array[i]) {
            for(size_t j = i + 1; j < size; ++j) {
                array[j - 1] = array[j];
            }
            --size; --i;
        }
    }
    return size;
}

int main(void) {
    int array[1024];
    size_t count; scanf("%lu", &count);
    for(size_t i = 0; i < count; ++i) scanf("%d", &array[i]);
    count = CompactIntegers(array, count);
    printf("%lu\n", count);
    for(size_t i = 0; i < count; ++i) printf("%d ", array[i]);
    printf("\n");
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-28 12:08:49 | 显示全部楼层
感觉2楼最简便以及贴合我最开始的想法,容易理解,谢谢大家的解惑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 19:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表