0
点赞
收藏
分享

微信扫一扫

华为OD机试之一种字符串压缩表示的解压(Java源码)

ITWYY 2023-05-21 阅读 65

一种字符串压缩表示的解压

题目描述

输入描述

输出描述

输入输出说明
4dffddddff4d扩展为dddd,故解压后的字符串为ddddff。
2dff!error两个d不需要压缩,故输入不合法。
4d@A!error全部由小写英文字母组成的字符串压缩后不会出现特殊字符@和大写字母A,故输入不合法。

源码和解析
解析:

import java.util.ArrayList;

public class T7 {
	public static void main(String[] args) {
		String input = "4dff";
		if (!check(input)) {
			System.out.println("!error");
			System.exit(0);
		}
		char chArr[] = input.toCharArray();
		// 重组字符 a15dff3d=> [1,15,d,f,f,3,d]
		ArrayList<String> chList = new ArrayList<>();
		String item = "";
		boolean isNumber = false;
		StringBuilder result = new StringBuilder();
		for (char c : chArr) {
			if (isNumberic(c)) {
				// 当前是数字
				if (isNumber) {
					// 前一个字符也是数字
					item += c;
				} else {
					// 前一个字符不是数字
					item = c + "";
					isNumber = true;
				}
			} else {
				// 是字符
				if (isNumber) {
					// 前面的是数字
					chList.add(item);
					item = "";
					isNumber = false;
				}
				chList.add(c + "");
			}
		}
		boolean flag = false;// 前一位是否是数字
		for (int j = 0; j < chList.size(); j++) {
			String n = chList.get(j);
			if (n.length() == 1) {
				// 单字符 可能是数字 也可能是字母
				if (isNumberic(n.charAt(0))) {
					// 是数字
					int len = Integer.parseInt(n);
					if (len <= 2) {
						System.out.println("!error");
						System.exit(0);
					}
					for (int i = 0; i < len; i++) {
						result.append(chList.get(j + 1));
					}
					flag = true;
				} else {
					// 是字符
					if (flag == false) {
						// 前一位是字符 直接拼接
						result.append(n);
					}
					flag = false;
				}
			} else {
				// 肯定是数字
				int len = Integer.parseInt(n);
				flag = true;
				for (int i = 0; i < len; i++) {
					result.append(chList.get(j + 1));
				}
			}
		}
		// System.out.println(chList);
		System.out.println(result);
	}

	// 判断单字符是否是数字
	static boolean isNumberic(char c) {
		int chr = c;// 转为ASCII码来判断 48位0
		if (chr >= 48 && chr <= 57) { // (int)'0' ==>48
			return true;
		}
		return false;
	}

	// 检查只包含数字和小写字母(未来过滤2及以下数字)
	static boolean check(String param) {
		char chArr[] = param.toCharArray();
		// 最后一位是数字也不行
		if (isNumberic(chArr[chArr.length - 1])) {
			return false;
		}
		boolean flag = true;
		for (char c : chArr) {
			if (c >= 'a' && c <= 'z') {
				continue;
			}
			int chr = c;// 转为ASCII码来判断 48位0
			if (chr >= 48 && chr <= 57) { // (int)'0' ==>48
				continue;
			}
			flag = false;
			break;
		}
		return flag;
	}
}
举报

相关推荐

0 条评论