网站建设费预付定金什么科目,企业网站建站之星,驻马店住房和城乡建设局网站,歌曲网站模板一种字符串压缩表示的解压
题目描述 有一种简易压缩算法#xff1a;针对全部由小写英文字母组成的字符串#xff0c;将其中连续超过两个相同字母的部分压缩为连续个数加该字母#xff0c;其他部分保持原样不变。 例如#xff1a;字符串“aaabbccccd”经过压缩成为字符串“…一种字符串压缩表示的解压
题目描述 有一种简易压缩算法针对全部由小写英文字母组成的字符串将其中连续超过两个相同字母的部分压缩为连续个数加该字母其他部分保持原样不变。 例如字符串“aaabbccccd”经过压缩成为字符串“3abb4cd”。 请您编写解压函数根据输入的字符串判断其是否为合法压缩过的字符串 若输入合法则输出解压缩后的字符串否则输出字符串“error” 来报告错误 输入描述 输入一行为一个ASCII字符串长度不会超过100字符用例保证输出的字符串长度也不会超过100字符。 输出描述 若判断输入为合法的经过压缩后的字符串则输出压缩前的字符串若输入不合法则输出字符串“ 输入输出说明4dffddddff4d扩展为dddd故解压后的字符串为ddddff。2dff!error两个d不需要压缩故输入不合法。4dA!error全部由小写英文字母组成的字符串压缩后不会出现特殊字符和大写字母A故输入不合法。
源码和解析 解析 按照题意可知 1.合法的压缩字串只应包含数字和小写字母 包含其他字符则为不合法的且数字必须大于2否则也是不合法的。例如dd压缩为2d 其字符数并未减少达不到压缩的效果。数字后必须出现字符否则也是不合法的数据。最后一位是数字也不行 2.解决这个题首先得判读是否合法若合法则再进行还原 3.还原时遇见数字n则可以使用循环来产生n个数字后出现的字符。 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]ArrayListString 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位0if (chr 48 chr 57) { // (int)0 48return 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位0if (chr 48 chr 57) { // (int)0 48continue;}flag false;break;}return flag;}
}