| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3573 人关注过本帖
标题:元素移除
只看楼主 加入收藏
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
元素移除
在一个网站上看到的例题:给定一个数组和一个数(该数不一定在数组中),从数组里删掉这个数字,返回剩下的数组长度。
如:A[] = {1, 2, 3, 4, 5}, 要删除数字3, 那么返回数组长度为4.
提示: int removeElement(int A[], int n, int elem)
其中,n代表数组长度,elem代表要删掉的元素。
格式:
输入一个数n,继而输入一个数组A[n],接着输入要删除的元素elem,返回剩余数组长度index.

遇到的问题是:
我在c-free5.0上编译和测试都正常。提交到网站的时候提示运行错误,提示有可能出现非法的内存单元访问、数组越界等情况,导致段异常错误。

二楼先贴代码,各位帮忙看下,我感觉因为是我在程序中手动添加 A[n]='\0'; 数组结束标记这里的原因。但不加的话我输出数组元素会发现有越界访问。

测试数据:
5
1 2 3 4 5
3


[此贴子已经被作者于2016-6-2 17:00编辑过]

搜索更多相关主题的帖子: 网站 元素 
2016-06-02 16:59
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//先判断有几个元素等于elem,即需调用几次removeElement
int same_elem(int A[],int n,int elem)
{
    int i=0;
    //统计几次相等
    int num=0; 
    for(i=0;i<n;i++)
    {
        if(elem==A[i])
            num++;            
    }    
    return num;
} 
//移除函数 
int removeElement(int A[], int n, int elem,int m)
{
    int i=0,j=0;
    for(i=0;i<n;i++)
    {
        if(elem==A[i])
        {
            for(j=i;j<n;j++)
                A[j]=A[j+1];                        
            A[n]='\0';
            break;
        }    
    }    
    n=0;
    i=0;
    printf("\n第%d次删除后数组为:\n\n",m+1);
    while(A[i]!=0)
    {        
        
        printf("arr[%d]=%d\t",i,A[i]);
        n++;
        i++;        
    }    
    printf("\n");
    return n;
}
//清空缓存函数
void safe_flush(FILE *fp)
{
    int ch;
    while( (ch = fgetc(fp)) != EOF && ch != '\n' );          
}
//主函数 
int main()
{
    int i=0, n=0,num=0,m=0;
    //elem要删除的元素,index剩下的数组长度
    int elem=0,index=0;  
    printf("先输入动态数组的长度: ");
    scanf("%d", &n);    
    int* arr = (int *)calloc(n,sizeof(int));    
    printf("\n输入%d个整数给数组赋值\n\n",n);
    //给数组赋值
    for(i = 0; i < n; i++)
        scanf("%d",&arr[i]);
    //给数组最后加上结束符
    arr[n]='\0';    
    //清除输入超过n长度的数字,避免后续误读入存进elem中 
    safe_flush(stdin);
//    getchar();    
    //输出该数组的元素值 
    printf("\n初始数组为:\n\n");
    for(i = 0; i < n; i++)
        printf("arr[%d]=%d\t",i,arr[i]);
       //输入需要删除的元素
    printf("\n\n请输入要删除的元素值: ");
    scanf("%d",&elem); 
       //调用函数判断数组中有几个需要删除的元素 
    num=same_elem(arr,n,elem);
    //调用移除函数计算剩下的数组长度 
     if(num!=0)
    {
        index=n;
        for(i=0;i<num;i++)
        {
            index=removeElement(arr,index,elem,m);
            m++;
        }     
        printf("\n删除元素后的数组长度为: %d\n\n",index);
    }          
    else 
    {
        printf("\n该元素不在数组内.\n\n");
            exit(0);
    }
    //释放堆内存 
    free(arr);
    //将arr指向NULL,避免通过arr不当使用已经释放的内存 
    arr=NULL;
    return 0;
}
2016-06-02 16:59
alice_usnet
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:18
帖 子:370
专家分:2020
注 册:2016-3-7
收藏
得分:0 
数组的长度不是n吗?为什么会有arr[n]?

未佩好剑,转身便已是江湖
2016-06-02 17:45
alice_usnet
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:18
帖 子:370
专家分:2020
注 册:2016-3-7
收藏
得分:20 
有个偷懒的方法计算指定元素在数组中出现的次数,用数组长度减去该元素出现的次数就是删除后的长度。反正只要长度而不要删除后的数组,懒人的方法

未佩好剑,转身便已是江湖
2016-06-02 18:08
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
回复 4楼 alice_usnet
哈哈,对哦,根本不需要把同样的元素删除,然后再去计算数组长度,直接判断有几个相同的,然后用n减去相同的次数就可以了啊
2016-06-02 20:17
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
俺最喜欢看原题了,因为水平原因,转述者总喜欢将自己无法理解的部分省略掉
原题:https://
可见,元素移除动作是不可以省略的

抛砖引玉(俺不喜欢leetcode,接口不规范,评测也抽风)
程序代码:
int removeElement(int* nums, int numsSize, int val) {
    int* p = nums;
    for( int* a=nums; a!=nums+numsSize; ++a )
        if( *a != val )
            *p++ = *a;
    return p-nums;
}

2016-06-03 09:25
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
回复 6楼 rjsp
学习了,thanks,看了你提供的题目,我的题目是和你这个类似的网站上,计蒜客上复制过来的,上面的要求相对简单很多,要让网站后台AC就简单很多,不过如果真的从解决这个问题本身出发,就要考虑全面,考虑重复元素的问题了。中间我加了很多输出函数,是为了跟踪每次循环后的数组变化情况。

[此贴子已经被作者于2016-6-3 11:18编辑过]

2016-06-03 11:08
快速回复:元素移除
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020104 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved