删除重复元素的算法

删除重复元素的算法

问:怎样用一个方法去掉一个数组的重复元素
  1. 答:可以使用双重循环,逐一对比元素,如有重复,则删除的方法去重。
    其思路为
    1、依次遍历循环中的每一个元素。
    2、对于任意一个元素,依次与之前的元素进行对比,如果有重复则删除。
    3、删除操作可以采用将后续元素逐个前移,达到覆盖当前元素的效果。
    在此基础上可以进行一点优化,即,不需要每次删除元素均前移所有元素,而是把需要保留的元素放到"应该"放的位置即可,这样可以提高效率。
    以数组为例,参考代码如下:
    int remove_repeat(int *a, int l)//对起始地址为a,长度为l的数组进行去重,新的长度以形式返回。
    {
    int i,j, r=0; //i,j为循环下标,r为去重后元素总数,初始值为0
    for(i = 0; i < l; i ++)
    {
    for(j = 0; j < r; j ++)//检查是否重复
    if(a[j] == a[i]) break;
    if(j == r) //没有重复元素
    a[r++] = a[i]; //将当前元素放置与去重后数组的尾部,并增加去重后的总数。
    }
    return r; //返回新的长度。
    }
  2. 答:思路:首先想到的一个方法是遍历,将整个数组遍历一遍,如果之前没有出现过,将其放到一个新的数组中,最后返回这个数组。
    function unique(array){
    var n = [];//一个新的临时数组
    //遍历当前数组
    for(var i=0; i<array.length; i++){
    //如果当前数组的第i已经保存进了临时数组,那么跳过,
    //否则把当前项push到临时数组里面
    if(n.indexOf(array[i]) == -1){
    n.push(array[i]);
    }
    }
    return n;
    }
    //判断浏览器是否支持indexOf,indexOf为ecmaScript5新方法IE8以下(包括IE8,IE8只支持部分ecma5)不支持
    if(!Array.prototype.indexOf){
    //新增indexOf方法
    Array.prototype.indexOf = function(item){
    var result = -1;
    var a_item = null;
    if(this.length == 0){
    return result;
    }
    for(var i = 0,len = this.length; i < len; i++){
    a_item = this[i];
    if(a_item === item){
    result = i;
    break;
    }
    }
    return result;
    }
    }
问:C语言删除一个整型数组里面重复的元素
  1. 答:利用双重循环,将每个值依次与其后面的值相比较,如果有相同的则删除该元素即可。
    删除时,可以使用将后面元素依次向前移动一位,同时总长度减一的方式。
    参考代码如下:
    int remove_repeat(int *a, int l)
    {
        int i, j, k;
        
        for(i = 0; i < l; i ++)
        {
            for(j = i+1; j <l; j ++)//对后面每个元素比较,去重。
            {
                if(a[j] == a[i])//发现重复元素。
                {
                    for(k = j+1; k<l; k ++)//依次前移一位。
                        a[k-1] = a[k];
                    l--;//总长度减一。
                }
            }
        }
        
        return l;//返回新的长度值。
    }
  2. 答:将第一个元素输出,再后面的一个个与前面的比较,有相等的就继续循环,不等的就输出,用for语句做
  3. 答:int elimination(int a[], int count){ //去除数组中重复的元素
    int i, j, k;
    for (i = 0; i < count; i++){
    for (j = i + 1; j < count; j++){
    if (a[j] == a[i]){
    for (k = j + 1; k< count; k++)
    a[k - 1] = a[k];
    count--;
    j--;
    }
    }
    }
    return count;
    }
  4. 答:我跟你直接说思路吧,他们这样的双重循环数组太大的话很耗时间的,你可以,先给数组排序,然后删除多余的数就很耗操作了,只需要看相邻的数就可以了。
  5. 答:for(int i=0; i<length;i++){
    for(int j=0; j<i;j++){
    if(arr[j]=arr[i]){
    for(int k=i+1;k<length;k++){
    arr[k-1]=arr[k];
    }
    length--;
    break;
    }
    }
    }
  6. 答:int i, j;
    int buf[] = {1,2,3,3,2,1};
    int count = strlen(buf);
    for(i = 0; i < count; i++){
    for(j = i+1; j < count; j++){
    if(buf[i] == buf[j]){
    buf[j] ^= buf[count];
    buf[count] ^= buf[j];
    buf[j] ^= buf[count];
    count--;
    }
    }
    }
    buf[count] = '\0';
    提供给你个思路 我没有调试,不过思路我觉得不错!
    就是从数组里第一个元素开始找相同的,如果相同就把 相同元素和数组最后一位交换,下一个相同的就和数组倒数第二位交换,最后把 count位变成‘/0’,最后打印数组。
问:请问C#中有没有判断数组元素重复,或如何去除重复呀?
  1. 答:C#数组去除重复元素算法:
    通过遍历原数组中的每一个元素,将元素添加到新的listString中,如果listString已经包含了就不添加,当遍历完原数组,泛型中保存的就是去重后的结果了。
    由于需求对结果的元素序列没有任何要求,采取了下列算法来提高效率
    string[] stringArray = {...因为是从文件读取的,这里省略了...}
    List<string> listString =new List<string>();
    Array.Sort(stringArray );//排序数组
    int MaxLine = stringArray.Length;
    #region 单独计算第一个
    if (sourceData[0] != stringArray[1])
    {
    listString.Add(stringArray[0]);
    }
    #endregion
    for (int i =1; i < MaxLine; i++)
    {
    if (sourceData[i] != stringArray[i-1])
    {
    listString.Add(stringArray[i]);
    }
    }
    思路是:首先对数组进行排序,这样相同的数组就排列在了一起。然后遍历原数组,一次取出当前元素和上一个元素,如果2个元素相等就跳过,不相等就将其元素的保存到泛型listString中。(第一次运行的时候,前一个元素为空,所以把第一个元素单独拿出来处理)
删除重复元素的算法
下载Doc文档

猜你喜欢