较为简易的数组去重算法

好久好久没有写博客了,今天在抖音上看到一道笔试题要求写一个简易的数组去重算法,于是乎自己捣鼓了一下写出了一个小型的简易算法。话不多说上菜

算法原理

在算法中我设置了几个变量,i,j 为数组的下标,jump为跳转的位数(就是替换前一个位置的下一个位置离前一个位置的距离),deleteItemNumber 为删除的数组的总位数。总体的演示图如下:
初始时如下:
在这里插入图片描述
之后对该数组进行二重循环遍历,i从0到7并设置一个循环当a[j+jump] == a[i]时就将jump自增直至a[j+jump] != a[i]且 j+jump < 删减后的a数组长度 为止,这样做的目的是为了删除连续的相同的字符
在这里插入图片描述
之后进行替换(即a[j] = a[j+jump])在这里插入图片描述
在这里插入图片描述
之后进入下一层循环,注意这时i的范围变成了1到6(7-1)因为之前的循环中已经删掉了一位。之后继续循环,直到得出结果

算法实现代码

本算法采用java或c均可实现。由于本人对java更为熟悉所以使用了java

/**
  * 删除数组中的重复元素(去重)
  * @param ch
  * @return
  */
 public static char[] deleteSurplusItem(char[] ch) {
    
    
  int deleteItemNumber = 0;
  for(int i = 0;i<ch.length-deleteItemNumber;i++) {
    
    
   int jump = 0; //设置跳转的位数
   for(int j=i+1;j+jump<ch.length-deleteItemNumber;j++) {
    
    
    //如果下一个要置换的元素和初始元素重复了就跳过
    while((j+jump) < (ch.length-deleteItemNumber) && ch[j+jump] == ch[i]) {
    
    
     jump++;
    }
    if((j+jump) >= (ch.length-deleteItemNumber)) {
    
    
     break;
    }
    ch[j] = ch[j+jump];
   }
   deleteItemNumber += jump;
  }
  //使用新的数组进行替换
  char[] ch2 = new char[ch.length-deleteItemNumber];
  for(int i=0;i<ch2.length;i++) {
    
    
   ch2[i] = ch[i];
  }
  return ch2;
 }

算法验证

输入:ajskdljawjidddddd
输出:在这里插入图片描述

————————————————分割线——————————————
这种算法是不需要排序的算法,因此其时间复杂度比较高。当然也可以先进行排序之后进行去重的方式这样时间复杂度较低,但是如果先进行排序后会打乱原来数组中元素的顺序。总之看个人和业务需求了。
————————————————分割线——————————————
说来惭愧,刚才看到一种算法相当简单,那就是统计一串字符串的所有不同字符的个数将其存到一个对象如一个Map中重复的不再记录然后直接打印map的keyset就能够直接去重。该算法可以说是相当易懂。

————————————————分割线——————————————
欢迎大家的留言

おすすめ

転載: blog.csdn.net/qq_31236027/article/details/106682255