今天在简书上看到这样一道有趣的算法题:

解题思路

  • 首先定义一个变量element,默认是字符串的第一个字符。以element为基准元素,去判断某个字符是否重复。然后再去定义一个变量count去记录重复的次数,初始值应该为1

  • 然后我们去遍历整个字符串,应该从第1号位置的字符开始遍历。如果当前字符等于element,就说明该字符在当前字符串中出现过,已经重复了。那么count就应该自增。

  • 如果当前字符不等于element,就说明上一个字符连续的重复次数已经计算完毕,可以进行拼接操作。接下来我们就可以操作当前字符了,count还原到初始值1。

  • 遍历结束时,进行拼接操作。为什么不在第二步进行拼接操作? 因为当前字符在整个字符串中重复的次数还没有统计完,如果记录一次重复的次数,就进行拼接的操作的话,肯定不能达到预期效果。假如字符串是“ppppp”,如果这样做了,输出结果会是"p2p3p4p5"。所以必须要统计完某一个字符的重复次数,才能进行拼接操作。我们只需要计算一个字符连续的重复次数。当我们遍历某一个字符时,发现它不等于element,就说明它上一个字符重复次数已经统计好,这时候我们才可以进行拼接字符串操作。

应该注意的问题

  • 先一般,后特殊。进行边界控制,我们要去判断字符串是否为null 或者“”,然后去做相应的判断。

  • 每次必须在前推进循环不变式中涉及到的变量值。

  • 比如一个字符a在该字符串中出现过1次,那么应该输出a,而不是a1

  • 不要使用字符串拼接的形式拼接数据,String是不可变对象,每次拼接会生成新的String对象。使用StringBuffer是线程安全的,还是可变对象。每次调用append()并不会生成一个新的字符串。

代码实现:

public class Demo {
public static void main(String[] args) {
encode("wwwbbawabbb");
encode("a");
encode("abcabcccc");
encode("ppppprrrrppp");
encode("");
encode(null);
} public static void encode(String str) {
if (str == null || str.equals("")) {
System.out.println("");
return;
} // 利用StringBuffer变量字符串接受结果
StringBuffer sb = new StringBuffer(); char element = str.charAt(0);
int count=1;
for(int i=1;i<str.length();i++) {
if(element==str.charAt(i)) {
count++;
}else {
//当读到另一个不一样的字符的时候,再拼接之前统计的字符
sb.append(element);
//如果统计数量为1的时候不输出统计数量
sb.append(count==1 ? "" :count);
element = str.charAt(i);
count=1;
}
}
// 保证当最后一个字符和统计的数量都拼接上
sb.append(element);
sb.append(count==1 ? "" :count); // 输出整个结果
System.out.println(sb.toString());
}
}

原文地址:https://www.jianshu.com/p/32756f1ea4e7

使用java语言,将字符串中连续重复出现的字母变成“出现次数“+字母的格式的更多相关文章

  1. java 统计字符串中连续重复的字符,并得出新字符串

    题目: 比如输入为aaabbc,输出a3b2c1 完整解答: public class Other { static String func(String str) { StringBuffer re ...

  2. [java] 找出字符串中出现最多的字符和出现的次数

    逛园子看到一童鞋做的华为上机题目,写来好长的代码,懒得看,感觉不可能这么难,于是动手敲了下. import java.util.Scanner; public class StringTest { / ...

  3. 三种java 去掉字符串中的重复字符函数

    三种java 去掉字符串中的重复字符函数 public static void main(string[] args) { system.out.println(removerepeatedchar( ...

  4. java 获得字符串中最大重复子串长度

    参考:http://blog.csdn.net/csdn_yaobo/article/details/50338025 要找一串字符串中,重复的字串长度,.例如ABCX1&ABC,中ABC重复 ...

  5. JAVA----编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符

    package com.pb.demo.packclass.demo1; import java.util.HashSet; /** * 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符 ...

  6. 《程序员代码面试指南》第五章 字符串问题 去掉字符串中连续出现k 个0 的子串

    题目 去掉字符串中连续出现k 个0 的子串 java代码 package com.lizhouwei.chapter5; /** * @Description: 去掉字符串中连续出现k 个0 的子串 ...

  7. c# 过滤字符串中的重复字符

    有字符串"a,s,d,v,a,v",如果想去除其中重复的字符,怎么做? 下面是一个方法,用Hashtable来记录唯一字符,排除重复字符,仅供参考. 1.过滤方法: public ...

  8. Java-Runoob-高级教程-实例-数组:10. Java 实例 – 查找数组中的重复元素-un

    ylbtech-Java-Runoob-高级教程-实例-数组:10. Java 实例 – 查找数组中的重复元素 1.返回顶部 1. Java 实例 - 查找数组中的重复元素  Java 实例 以下实例 ...

  9. Java 获取一个字符串中,另一个字符串出现的次数

    Java 获取一个字符串中,另一个字符串出现的次数 思想: 1. indexOf到字符串中到第一次出现的索引2. 找到的索引+被找字符串长度,截取字符串3. 计数器++ 代码实现: public cl ...

随机推荐

  1. too many open files linux服务器 golang java

    1. 现象 服务的cpu跑满(golang实现), 并大量报too many open files错误.服务使用systemd来运行,部署在阿里ecs上. 2.分析 从日志来看,cpu的上升主要为到达 ...

  2. 【codeforces 516B】Drazil and Tiles

    题目链接: http://codeforces.com/problemset/problem/516/B 题解: 首先可以得到一个以‘.’为点的无向图,当存在一个点没有边时,无解.然后如果这个图边双联 ...

  3. jquery 判断一个元素是否在数组中 $.inarry()使用

    需要判断一个元素是否在一个数组里: js indexOf()方法  如果存在 则返回该元素的下标值 如果不存在则返回-1 学习源头: http://www.w3school.com.cn/jsref/ ...

  4. 你真的知道final关键字吗?

    概述 final在英文中是最终的,不可更改的.在Java中final修饰变量,函数和类,就像这个单词的意思,一旦使用赋值之后不可更改. final修饰的变量不可以被改变 finalTest类 publ ...

  5. 【Java进阶】并发编程

    PS:整理自极客时间<Java并发编程> 1. 概述 三种性质 可见性:一个线程对共享变量的修改,另一个线程能立刻看到.缓存可导致可见性问题. 原子性:一个或多个CPU执行操作不被中断.线 ...

  6. 单例模式--java代码实现

    单例模式 单例模式,顾名思义,在程序运行中,实例化某个类时只实例化一次,即只有一个实例对象存在.例如在古代,一个国家只能有一个皇帝,在现代则是主席或总统等. 在Java语言中单例模式有以下实现方式 1 ...

  7. 啥?客户叫在DataGridView的左上角添加CheckBox?

    效果图是这样的,如何把CheckBox放到左上角是最重要的. 添加方法 InitColumnInfo() 方法,代码如下. private void InitColumnInfo() { ; Data ...

  8. Python爬虫入门教程 60-100 python识别验证码,阿里、腾讯、百度、聚合数据等大公司都这么干

    常见验证码 之前的博客中已经解决了一些常见验证码的问题,但是验证码是层出不穷的,目前解决验证码除了通过常规手段解决以外,还可以通过人工智能领域的深度学习去解决 深度学习?! 无疑对爬虫coder提高了 ...

  9. PBFT概念与Go语言入门(Tendermint基础)

    Tendermint作为当前最知名且实用的PBFT框架,网上资料并不很多,而实现Tendermint和以太坊的Go语言,由于相对小众,也存在资料匮乏和模糊错漏的问题.本文简单介绍PBFT概念和Go语言 ...

  10. MVC图片上传详解

    MVC图片上传--控制器方法 新建一个控制器命名为File,定义一个Img方法 [HttpPost]public ActionResult Img(HttpPostedFileBase shangch ...