连续顺序替换 连续重复字母替换

package com.yinhai.onehour; // 包路径不可修改!!!

import java.util.*;  //只能使用最高1.8版本JDK提供的API

/**
 * 题目:给定一个字符串(只包含小写英文字母),按顺序执行以下两条规则,输出计算后的字符串。
 * <p>
 * 规则 1:对于连续顺序4位及以上的字母,中间使用“~”替换。
 * 例如:ahhhhhhbcdefko, 替换后为ahhhhhhb~fko。
 * <p>
 * 规则2:对于连续重复出现3个及以上的字母,以该字母+重复的个数替换。
 * 例如:ahhhhhhbcdefko,替换后为ah6bcdefko。
 * <p>
 * 总体示例:
 * 输入字符串为:ahhhhhhbcdefko     结果为:ah6b~fko
 * 输入字符串为:ahhhhhhbcdefko     结果为:ah6b~fko
 * 输入字符串为:ammmmmnopqko       结果为:am5~qko
 * 输入字符串为:abcdefffffadfasdfa 结果为:a~f5adfasdfa
 * 输入字符串为:mnopqqqrstabs      结果为:m~q3~tabs
 * 输入字符串为:xyzabcd 			  结果为:xyza~d
 * <p>
 * 提示:
 * 1. 规则按规则1,规则2顺序执行。先执行1,后执行2。
 * 2. 请注意边界值的考虑,注意连续出现条件匹配的情况。
 * 3. 请注意字符串拼接的性能消耗。
 * 4. 请先花一定时间理清思路在再编写代码。
 * 5. 可以试着把上面总体实例中的例子跑正确后再提交。
 */
public class Template { //类名不可修改!!!
	/**
	 * 程序逻辑请在该方法中完成
	 * <p>
	 * 注意:
	 * 1. 方法名、参数个数及类型不可更改,只可修改函数体!!!
	 * 2. 提交文件时,保证包路径package com.yinhai.onehour
	 *
	 * @param inData 参数 验证程序通过该参数传入字符串
	 * @return 返回值 验证程序通过该返回值验证程序正确性
	 */
	public String methodTest(String inData) {
		String outData = "";
		outData+=rule1(inData);
		outData=rule2(outData);
		// outData = myMethod(inData); // 可添加自己的函数
		return outData;
	}

	private String rule1(String inData) {
		StringBuilder outData =new StringBuilder();
		for (int i = 0; i < inData.length(); i++) {
			int begin = i;
			//起始字母
			char begin_char = inData.charAt(begin);
			//判断是否是最后一个字母 和 是否是连续4个字母
			while (begin + 1 < inData.length() && inData.charAt(begin + 1) - begin_char == 1) {
				begin_char = inData.charAt(begin + 1);
				begin++;
			}
			//出现连续4个字符替换,否则不变
			if (begin - i >= 3) {
				outData.append(inData.charAt(i) + "~" + inData.charAt(begin));
				i = begin;
			} else {
				outData.append(inData.charAt(i));
			}
		}
		return outData.toString();
	}


	private String rule2(String inData) {
		StringBuilder outData = new StringBuilder();
		for (int i = 0; i < inData.length(); i++) {
			int begin = i;
			//起始字母
			char begin_ch = inData.charAt(begin);
			//判断是否是最后一个字母 和 连续3个字母是否相同
			while (begin + 1 < inData.length() && inData.charAt(begin + 1) - begin_ch == 0) {
				begin_ch = inData.charAt(begin + 1);
				begin++;
			}
			//当连续3个字母相同时替换,否则不变
			if (begin - i >= 2) {
				outData.append(inData.charAt(i) + "" + (begin - i + 1)) ;
				i = begin;
			} else {
				outData.append(inData.charAt(i));
			}
		}
		return outData.toString();
	}

	/**
	 * 可修改,验证自己的答案
	 *
	 * @param args
	 */
	public static void main(String[] args) {
		List<String> inDatas = new ArrayList<>();
		inDatas.add("ahhhhhhbcdefko");
		inDatas.add("ahhhhhhbcdefko");
		inDatas.add("ammmmmnopqko");
		inDatas.add("abcdefffffadfasdfa");
		inDatas.add("mnopqqqrstabs");
		inDatas.add("xyzabcd");

		List<String> outDatas = new ArrayList<>();
		outDatas.add("ah6b~fko");
		outDatas.add("ah6b~fko");
		outDatas.add("am5~qko");
		outDatas.add("a~f5adfasdfa");
		outDatas.add("m~q3~tabs");
		outDatas.add("xyza~d");

		// 用于自己校验结果
		Template template = new Template();
		long startTime = System.currentTimeMillis();

		for (int i = 0;i < inDatas.size();i++) {
			String result = template.methodTest(inDatas.get(i));
			System.out.println(result.equals(outDatas.get(i)));
		}

		long endTime = System.currentTimeMillis();
		System.out.println("耗时(毫秒):" + (endTime - startTime));
	}
}

发布了116 篇原创文章 · 获赞 107 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_35385687/article/details/103932959