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

解题思路

  • 首先定义一个变量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. JUC中AQS简介

    AQS,在java.util.concurrent.locks包中,AbstractQueuedSynchronizer这个类是并发包中的核心,了解其他类之前,需要先弄清楚AQS.在JUC的很多类中都 ...

  2. BZOJ_1833_[ZJOI2010]count 数字计数_数位DP

    BZOJ_1833_[ZJOI2010]count 数字计数_数位DP 题意: 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 分析: 数位DP f[i][ ...

  3. 什么是语义化的HTML?为什么要做到语义化?

    一.什么是语义化的HTML? 语义化的HTML就是写出的HTML代码,符合内容的结构化(内容语义化),选择合适的标签(代码语义化),能够便于开发者阅读和写出更优雅的代码的同时让浏览器的爬虫和机器很好地 ...

  4. C++的代理类

    怎样在一个容器中包含类型不同,但是彼此有关系的对象?众所周知,C++的容器只能存放类型相同的元素,所以直接在一个容器中存储不同类型的对象本身是不可能的,只能通过以下两种方案实现: 1. 提供一个间接层 ...

  5. windows下,读取快捷方式lnk所指向的路径

    BOOL GetLnkFileName( OUT PWSTR pLnkName, OUT PWSTR OepnFileNameBuufer, IN DWORD OpenFileNameBufferSi ...

  6. JavaSE:关键字(全)

    访问控制: private 访问控制方式:私有的 protected 访问控制方式:受保护的 public 访问控制方式:公共的 类.方法和变量修饰符: abstract 声明抽象,表明类或者成员方法 ...

  7. 驰骋工作流引擎 -Webservice接口说明文档

      关键词:工作流引擎接口说明  驰骋工作流接口参数详解 接口 LocalWSI /** * 待办 * @param userNo 用户编号 * @param sysNo 系统编号,为空时返回平台所有 ...

  8. 全球排名第一的免费开源ERP Odoo 12产品发布会北京站开始报名

    Odoo V12 产品(北京)发布会 暨企业数字化转型论坛 快速报名通道:http://odoochina.mikecrm.com/uG8nNu4 随着新版本Odoo 12的发布,开源智造(OSCG. ...

  9. 联发科Helio P90(mt6779),P70(mt6775),P60(MT6771),P35,P22(MT6762)芯片参数规格

    Helio P90(mt6779)是一款人工智能处理平台,集成了超级强大的AI专核APU 2.0,具有超强的AI性能和一系列基于人工智能的成像升级.该芯片将重新定义消费者对智能手机AI功能的体验.He ...

  10. 一次apk打开时报内存溢出错误,故写下内存溢出的各种原因和解决方法

    原转载:https://blog.csdn.net/cp_panda_5/article/details/79613870 正文内容: 对于JVM的内存写过的文章已经有点多了,而且有点烂了,不过说那么 ...