| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 648 人关注过本帖
标题:如何删除数组中相同的数字并输出?求解
只看楼主 加入收藏
xufan
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:232
专家分:804
注 册:2008-10-20
结帖率:88.89%
收藏
已结贴  问题点数:20 回复次数:5 
如何删除数组中相同的数字并输出?求解
意思是这样的,我有两个数组
int arrayA[] = {3,1,3,4,8,9,9,9};
int arrayB[] = {3,1,1,9,9,5,7,2};
然后删除它们相同的部分,所得结果应该是
int arrayA[] = {4,8};
int arrayB[] = {5,7,2};
但我写的程序输出不对,大神们看看怎么修改才是吧。
程序代码:
#include <iostream>
#include <map>
using namespace std;
int main()
{
    map<int,int> mapList;
    int arrayA[] = {3,1,3,4,8,9,9,9};
    int arrayB[] = {3,1,1,9,9,5,7,2};
    int aLen = (int)sizeof(arrayA)/sizeof(int);
    int bLen = (int)sizeof(arrayB)/sizeof(int);
    //mark object between arrayA
    for (int i = 0; i < aLen; i++)
    {
        map<int,int>::iterator it = mapList.find(arrayA[i]);
        if (it == mapList.end())
            mapList[arrayA[i]] = 0;
        else
            mapList[arrayA[i]] = 1;
    }
    //mark object between arrayB
    for (int i = 0; i < bLen; i++)
    {
        map<int,int>::iterator itor = mapList.find(arrayB[i]);
        if (itor == mapList.end())
            mapList[arrayB[i]] = 0;
        else
            mapList[arrayB[i]] = 1;
    }
    //print mapList
    for (map<int,int>::iterator it = mapList.begin(); it != mapList.end(); it++)
        cout<<it->first<<"-----"<<it->second<<endl;
    //delete mark from arrayA
    for (int i = 0; i < aLen; i++)
    {
        map<int,int>::iterator itor = mapList.find(arrayA[i]);
        if (1 == itor->second)//delete
        {
            for (int j = i; j < aLen - 1; j++)
                arrayA[j] = arrayA[j+1];
            aLen--;
        }
    }
    //delete mark from arrayB
    for (int i = 0; i < bLen; i++)
    {
        map<int,int>::iterator itor = mapList.find(arrayB[i]);
        if (1 == itor->second)//delete
        {
            for (int j = i; j < bLen - 1; j++)
                arrayB[j] = arrayB[j+1];
            bLen--;
        }
    }
    //print arrayA and arrayB
    cout<<"arrayA:"<<endl;
    for (int i = 0; i < aLen; i++)
        cout<<arrayA[i]<<" ";
    cout<<"\narrayB:"<<endl;
    for (int i = 0; i < bLen; i++)
        cout<<arrayB[i]<<" ";
    return 0;
}


 
搜索更多相关主题的帖子: 如何 
2013-10-23 16:32
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
你先口述一下你的算法吧...
我真心看不懂...

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-10-23 16:51
xufan
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:232
专家分:804
注 册:2008-10-20
收藏
得分:0 
我是这样考虑的。
第一步,先标记出两个数据给相同的数据,相同为1,不同的为0,用一个MAP存储。
第二步,根据这个MAP,删除值为1的元素。

~~~~~~我的明天我知道~~~。
2013-10-23 16:55
blueskiner
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:227
专家分:707
注 册:2008-9-22
收藏
得分:0 
这个,简单有简单的做,复杂也有复杂的做。
2013-10-23 17:22
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:20 
先将无关的说一下:
a. if (1 == itor->second) 是不严格的,如果 itor 无效,对其取值其行为是未定义的,应改为 if( itor!=mapList.end() && itor->second==1 )
b. 你的这个算法效率太低,我想可以这样:合并A和B到C中,将C排序,遍历一次就知道哪些有重复。另外,你删除数组内元素的算法,效率也很低。

回正题:你的 //delete mark from arrayA 算法是有错误的
一开始 {3,1,3,4,8,9,9,9}
你判断第0个元素(就是3),发现是重复数,然后数组变为 {1,3,4,8,9,9,9}
接着你判断第1个元素(就是3)……
你有没有发现,1被略过了吗?
如果不大改你的代码,最简单的办法是加一个 --i
    for (int i = 0; i < aLen; i++)
    {
        map<int,int>::iterator itor = mapList.find(arrayA[i]);
        //if (1 == itor->second)//delete
        if( itor!=mapList.end() && itor->second==1 )//delete
        {
            for (int j = i; j < aLen - 1; j++)
                arrayA[j] = arrayA[j+1];
            aLen--;
            --i;
        }
    }
2013-10-24 08:38
xufan
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:232
专家分:804
注 册:2008-10-20
收藏
得分:0 
恩,接受版主的意见,我再试试修改下。

~~~~~~我的明天我知道~~~。
2013-10-24 09:15
快速回复:如何删除数组中相同的数字并输出?求解
数据加载中...
 
   



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

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