注册 登录
编程论坛 C++教室

如何删除数组中相同的数字并输出?求解

xufan 发布于 2013-10-23 16:32, 648 次点击
意思是这样的,我有两个数组
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;
}


 
5 回复
#2
peach54602013-10-23 16:51
你先口述一下你的算法吧...
我真心看不懂...
#3
xufan2013-10-23 16:55
我是这样考虑的。
第一步,先标记出两个数据给相同的数据,相同为1,不同的为0,用一个MAP存储。
第二步,根据这个MAP,删除值为1的元素。
#4
blueskiner2013-10-23 17:22
这个,简单有简单的做,复杂也有复杂的做。
#5
rjsp2013-10-24 08:38
先将无关的说一下:
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;
        }
    }
#6
xufan2013-10-24 09:15
恩,接受版主的意见,我再试试修改下。
1