请你用java,c,c++ 中任何一种语言实现两个函数encode()和decode(),分别实现对字符串的变换和复原。
变换函数encode()顺序考察以知字符串的字符,按以下规则逐组生成新字符串:
(1)若已知字符串的当前字符不是大于0的数字字符,则复制该字符与新字符串中;
(2)若以已知字符串的当前字符是一个数字字符,且他之后没有后继字符,则简单地将它复制到新字符串中;
(3)若以已知字符串的当前字符是一个大于0的数字字符,并且还有后继字符,设该数字字符的面值为n,
则将它的后继字符(包括后继字符是一个数字字符) 重复复制n+1 次到新字符串中;
(4)以上述一次变换为一组,在不同组之间另插入一个下划线'_'用于分隔;
(5)若以知字符串中包含有下划线'_',则变换为用"/UL".
例如:encode()函数对字符串24ab_2t2的变换结果为 444_aaaaa_a_b_/UL_ttt_t_2
代码如下:
public class EncodeDecodeTest {
public static String encode(String str){
StringBuffer newstr = new StringBuffer("");
for(int i=0; i<str.length(); i++){
char a = str.charAt(i);
if( a>='0' && a <='9'){
if((i+1) == str.length()){
newstr.append(a);
}else{
int n = Integer.parseInt(String.valueOf(a));
char b = str.charAt(i+1);
for(int j=0; j< n+1; j++){
newstr.append(b);
}
}
}else if('_' == a){
newstr.append("/UL");
}else{
newstr.append(a);
}
newstr.append("_");
}
return newstr.substring(0, newstr.length()-1).toString();
}
public static String decode(String str){
StringBuffer newstr = new StringBuffer("");
int n = 1;
for(int i=0; i<str.length(); ){
char a = str.charAt(i);
n = 1;
System.out.println("i ="+i);
if(i<str.length()-3 && "/UL".equals(str.substring(i, i+3))){
newstr.append("_");
i = i+3;
}else if(a =='_'){
i++;
continue;
}else if( i < (str.length()-1)){
char b = str.charAt(i+1);
n = 0;
if(b != '_'){
for(int j=i; j<str.length() && b !='_'; j++){
b = str.charAt(j+1);
if(b != '_'){
n= n+1;
}
}
System.out.println(n);
newstr.append(n);
}else{
newstr.append(a);
}
i = i+n+1;
System.out.println("===="+newstr.toString());
}else{
newstr.append(a);
i++;
}
}
return newstr.substring(0, newstr.length()).toString();
}
public static void main(String args[]){
System.out.println(encode("24ab_2t2"));
System.out.println(decode(encode("24ab_2t2")));
}
}