`

数组中去掉重复的数字

    博客分类:
  • C++
 
阅读更多
题目: 有一个数组t[100],存放了1~99之间的数字,用效率较高的代码把重复数字去掉。例如数组{1,2,2,2,3,5,6,6}变成{1,2,3,5,6}。


××××××××××××××××××××××××××××××××××

申请标志数组


此题重复的数字可能不只一个,上述求和的方法不行了。因为是高效率,我们可以采用空间换时间的策略来解决。

设立访问标志数字,初始化为0,访问到N时将标志数字的第N个元素置为N

最后遍历该数组,若标志数组中对应值为非0,则顺序存储该数字于原数组中,最后返回去除重复数字后的有效数的个数


int RemoveRep(int array[], int n)

{

        int *arrayflag = (int *)malloc(n*sizeof(int));

        int left = 0, i = 0;


        while(i<n)

        arrayflag[i++] = false; //初始化标志数组


        for(i=0;i<n;i++)//剔除算法

        {

                arrayflag[array[i]] = array[i]; //将出现过的数保存到对应的位置

        }


        for(i=0;i<n;i++) //取出有效数

        {

                if(arrayflag[i] != false)

                       array[left++] = arrayflag[i];

        }

       

        return left;

}


××××××××××××××××××××××××××××××××××

符号标志法


上述方法的空间复杂度为O(N),利用符号位作为标志即可不申请O(N)标志数组


int SignedRemoveRep(int array[], int n)

{

        int i,left = 0;


        for(i=0;i<n;i++)//将出现过的位置置负号标志

        {

                if(array[i] > 0)

                       array[array[i]] = -array[array[i]];

                else

                       array[-array[i]] = -array[-array[i]];

        }


        for(i=0;i<n;i++)//抽取算法

        {

                if(array[i] < 0) //根据标志顺序保存出现过的值

                       array[left++] = i;

        }

       

        return left;

}


××××××××××××××××××××××××××××××××××

void main(void)

{

        int t[100];

        int i,j,left;


        for(i=0;i<100;i++)     //随机产生100个数字

        {

                j = rand()%99+1;

                t[i] = j;


                printf("%d ",t[i]);

                if(i%10 == 9)

                printf("\n");

        }


        //left = RemoveRep(t, 100);

        left = SignedRemoveRep(t, 100);


        for(i=0;i<left;i++)    

        {

                printf("%d ",t[i]);

                if(i%10 == 9)

                printf("\n");

        }

}
分享到:
评论
2 楼 mxdxm 2010-08-31  
sebarzi 写道
算法SignedRemoveRep 有bug
int t[8]={3,3,3,6,6,7,2,4};
此时输出
2 3 4 7
把3 也输出啦!



没错,是我疏忽了。第一次,出现数字时,将该数字的相应位置置为负数,当以后重复出现该数字时,就不应该在改变这个位置的符号了。

函数SignedRemoveRep中的部分代码改为如下:

for(i=0;i<n;i++)//将出现过的位置置负号标志

        {

                if(array[i] > 0)
                {
                    if(array[array[i]]>0)   //增加的
                       array[array[i]] = -array[array[i]];
                }

                else
                {
                     if(array[-array[i]]>0)  //增加的
                       array[-array[i]] = -array[-array[i]];
                }

        }
谢谢楼上兄台的指正!
1 楼 sebarzi 2010-08-24  
算法SignedRemoveRep 有bug
int t[8]={3,3,3,6,6,7,2,4};
此时输出
2 3 4 7
把3 也输出啦!

相关推荐

    matlab中如何去掉数组中重复的值

    unique 函数的基本语法为:B = unique(A),其中 A 是要处理的数组,B 是去除重复值后的数组。 例如,在命令行窗口中输入以下命令: ```matlab a = [1 3 4 5 6 6 7 8 9 8]; b = unique(a); ``` 然后,Matlab 将删除...

    用算法去除数组中重复的数字

    用算法去除数组中重复的数字(不使用查重函数)通过嵌套for循环和if条件判断实现,用算法去除数组中重复的数字(不使用查重函数)通过嵌套for循环和if条件判断实现

    二维数组去除重复项

    在处理这样的数据集时,经常需要去除重复的记录,以确保数据的准确性和效率。 ### PHP中的二维数组去重方法 给定的代码片段展示了如何在PHP中定义一个函数`unique_arr`,用于去除二维数组中的重复项。这个函数接受...

    C语言 数组中重复的数字分析及方法

    C语言 数组中重复的数字解决方法: 题目:在一个长度为n的数组里的所有数字都在0-n-1的 范围内。数组中某些数字是重复的,但是不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字...

    js 巧妙去除数组中的重复项

    YAHOO.util.YUILoader类中的一个方法提供了一种巧妙的解决方案,通过将数组转换为对象来去除重复项。这种方法利用了JavaScript对象的键不可重复性,从而有效地解决了问题。下面我们将详细探讨这个方法的实现、思路和...

    JavaScript合并两个数组并去除重复项的方法

    在JavaScript中,合并两个数组并去除重复项是一个常见的任务,特别是在处理数据集合或者组合不同来源的数据时。这里我们将深入探讨几种不同的方法来实现这个功能。 首先,我们可以使用`concat()`方法来合并两个数组...

    如何高效率去掉js数组中的重复项

    总结起来,去除JavaScript数组中的重复项有多种策略,包括常规模式、利用`sort()`函数以及利用JSON对象。每种方法都有其适用场景,开发人员应根据实际需求选择最适合的方法。在处理大量数据时,推荐使用利用JSON对象...

    Java替换int数组中重复数据的方法示例

    在Java中,我们还可以使用其他的去重复工具和方法,例如在线去除重复项工具、在线文本去重复工具等。这些工具可以帮助我们快速地过滤掉数组中的重复数据。 本文主要介绍了Java中替换int数组中重复数据的方法,包括...

    JS查找数组中重复元素的方法详解

    比如提供的在线去除重复项工具和在线文本去重复工具链接,它们简化了重复元素查找的过程,尤其适合非编程人员使用。 此外,本文还提到了一些扩展阅读资源,包括《JavaScript数组操作技巧总结》、《JavaScript排序...

    删除数组重复元素(VB.NET)

    - 在处理大数据时,考虑使用 LINQ(Language Integrated Query)来简化代码,如`Distinct`方法可轻松去除重复元素。 - 使用适当的数据结构,如HashSet或Dictionary,可以提高性能和代码的可读性。 总之,VB.NET中...

    PHP去除数组中重复的元素并按键名排序函数

    `assoc_unique`函数会去除重复的`id`,并且最后按照`id`的值对数组进行排序。运行这段代码后,`$aa`将只包含不重复且排序过的元素。 这个函数对于处理包含重复键值的数据集合非常有用,例如从数据库查询结果中去重...

    JavaScript去掉数组中的重复元素

    在JavaScript编程中,处理数组是常见的任务之一,而去除数组中的重复元素则是一项基本操作。数组去重可以提升数据处理的准确性和效率,尤其是在处理大量数据时。这里我们将探讨两种不同的JavaScript方法来实现这个...

    JS判断数组里是否有重复元素的方法小结

    除此之外,文档还提供了一些实用的在线工具,比如在线去除重复项工具、在线文本去重复工具、字数统计工具以及在线字符统计与编辑工具等,这些工具在处理字符串或数组时可以提供辅助性帮助。 总结上述方法,我们可以...

    javascript数组去掉重复

    这种方法解决了原始第三种方法中的一个潜在问题,即如果数组中同时存在数字和字符串,它们的值可能相同(例如数字5和字符串'5'),直接作为对象的属性名会导致覆盖。通过将它们的值转换成字符串再拼接其类型,就能...

    纯数数组去重复算法1千万3秒

    这样可以快速去除重复元素,但需要额外的内存空间。 2. **排序后去重**:对数组进行排序后,相邻的重复元素会集中在一起,通过遍历一次排序后的数组,只需保留第一个出现的元素即可。这种方法的时间复杂度是O(n log...

    php数组函数序列之array_unique() - 去除数组中重复的元素值

    这个函数通过删除数组中的重复值来“清洗”数组,使得数组中不会有重复的元素。array_unique()函数在处理数组时,会保留遇到的第一个元素值,并删除之后遇到的所有具有相同值的元素,最终返回一个没有重复值的新数组...

    javascript中去除数组重复元素的实现方法【实例】

    JavaScript中去除数组重复元素的方法主要涉及两种函数:isExistInArr 和 distinct。这两个函数配合使用可以实现数组去重的功能。接下来,我将详细解释这两种方法的实现原理以及在实际操作中如何应用。 首先,函数...

    php数组去重复数据示例

    这个函数首先使用`array_multisort()`按键倒序排序数组,然后用`array_unique()`去除重复的值。这说明了在PHP中,可以编写自定义函数来实现特定的数组去重逻辑,尤其是当标准函数`array_unique()`无法满足需求时。 ...

Global site tag (gtag.js) - Google Analytics