较为简易的数组去重算法

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

算法原理

在算法中我设置了几个变量,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就能够直接去重。该算法可以说是相当易懂。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zygswo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值