挑战1小时完成1道java编程题及答案

一、题目

题目:给定一个字符串(只包含小写英文字母),按顺序执行以下两条规则,输出计算后的字符串。
规则1:对于连续顺序4位及以上的字母,中间使用“~”替换。

例如:“ahhhhhhbcdefko”,替换后为ahhhhhhb~fko。

规则2:对于连续重复出现3个及以上的字母,以该字母+重复的个数替换。

例如:“ahhhhhhbcdefko”,替换后为ah6bcdefko。

总体示例:

输入字符串为:ahhhhhhbcdefko 结果为:ah6b~fko

输入字符串为:ammmmmnopqko 结果为:am5~qko

输入字符串为:abcdefffffadfasdfa 结果为:a~f5adfasdfa

输入字符串为:mnopqqqrstabs 结果为:m~q3~tabs

输入字符串为:xyzabcd 结果为:xyza~d

提示:

1. 规则按规则1,规则2顺序执行,先执行1,后执行2。

2. 请注意边界值的考虑,注意连续出现条件匹配的情况。

3. 请注意字符串拼接的性能消耗。

4. 请先花一定时间理清思路在再编写代码。

5. 可以试着把上面总体实例中的例子跑正确后再提交。


排名规则按以下顺序进行排名:

1、前提是运行结果正确

2、性能

3、提交时间

 二、答案

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

/**
 */
public class Template { //类名不可修改!!!
	/**
	 * 程序逻辑请在该方法中完成
	 *
	 * 注意:
	 * 1. 方法名、参数个数及类型不可更改,只可修改函数体!!!
	 * 2. 提交文件时,保证包路径package
	 *
	 * @param inData 参数 验证程序通过该参数传入字符串
	 * @return 返回值 验证程序通过该返回值验证程序正确性
	 */
	public String methodTest(String inData){
		//TODO 实现逻辑
		String validate = rule1(inData, 4);
		String outData = rule2(validate);
		return outData;
	}


	/**
	 * 可修改,验证自己的答案
	 * @param args
	 */
	public static void main(String[] args){
		// 用于自己校验结果
		Template template = new Template();
		long startTime = System.currentTimeMillis();
		String result = template.methodTest("abcdssttt");
		System.out.println(result);
		long endTime = System.currentTimeMillis();
		System.out.println("耗时(毫秒):" + (endTime - startTime));
	}


	@SuppressWarnings("all")
	public static String rule1(String value, int length){
		StringBuilder result = new StringBuilder();
		int i = 0;
		//计数器
		int counter = 1;
		StringBuilder temp = new StringBuilder();
		for(; i < value.length() -1;) {

			//当前ascii值
			int currentAscii = Integer.valueOf(value.charAt(i));
			//下一个ascii值
			int nextAscii = Integer.valueOf(value.charAt(i + 1));
			//计算两数之间差一位则为连续
			if(nextAscii - currentAscii == 1){
				temp.append(value.charAt(i));
				//计数器++
				counter++;
			}else{
				result.append(temp.toString());
				result.append(value.charAt(i));
				//重置
				counter = 1;
				temp = new StringBuilder();
			}

			//满足连续数字或者字母
			if(counter >= length ) {
				// todo: 将之前的替换
				if (i + 2 < value.length()){
					if(Integer.valueOf(value.charAt(i + 2)) - Integer.valueOf(value.charAt(i + 1)) != 1){
						result.append(temp.toString().charAt(0)).append("~").append(value.charAt(i+1));
						i++;
						//重置
						counter = 1;
						temp = new StringBuilder();
					}
				}else {
					result.append(temp.toString().charAt(0)).append("~");
					i++;
					//重置
					counter = 1;
					temp = new StringBuilder();
				}
			}

			i++;
		}

		//
		if (temp !=null && temp.toString().length() > 0){
			result.append(temp);
		}
		return result.append(value.charAt(value.length()-1)).toString();
	}


	@SuppressWarnings("all")
	private static String rule2(String orign){
		if(null == orign || orign.length()==0){
			return orign;
		}
		String des = "";
		StringBuilder stringBuilder = new StringBuilder("");
		char last = orign.charAt(0);
		int count = 1;
		for(int i=1;i<orign.length();i++){
			if(last==orign.charAt(i)){
				++count;
			}else{

				if (count == 2){
					stringBuilder.append(last).append("").append(last);
				
				}else {
					stringBuilder.append(last).append("").append(count==1?"":count);
			
				}



				last = orign.charAt(i);
				count = 1;
			}

		}
		if (count == 2){
			stringBuilder.append(last).append(last);
			return stringBuilder.toString();
		}else {
			stringBuilder.append(last).append(count==1?"":count);
			return stringBuilder.toString();
		}

	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值