今天去面试,碰到一个机试题,当时制作出来了正向转换,逆向的没做出来,回来以后,查了下网络,也是正向转换有答案,可是最难的逆向的还是没找到,花了1个多小时,重新把题目做了一下。这是题目:
请你用java,c,c++ 中任何一种语言实现两个函数encode()和decode(),分别实现对字符串的变换和复原。
变换函数encode()顺序考察以知字符串的字符,按以下规则逐组生成新字符串: (1)若已知字符串的当前字符不是大于0的数字字符,则复制该字符与新字符串中; (2)若以已知字符串的当前字符是一个数字字符,且他之后没有后继字符,则简单地将它复制到新字符串中; (3)若以已知字符串的当前字符是一个大于0的数字字符,并且还有后继字符,设该数字字符的面值为n, 则将它的后继字符(包括后继字符是一个数字字符) 重复复制n+1 次到新字符串中; (4)以上述一次变换为一组,在不同组之间另插入一个下划线'_'用于分隔; (5)若以知字符串中包含有下划线'_',则变换为用"/UL".
如:”__0a\\U\\3_4b\\\\“==========》\UL_\UL_0_a_\_U_\______\UL_bbbbb_b_\_\
"\\23b_2__f4" ==========》\_333_bbbb_b_\UL_____\UL_\UL_f_4
"b\\__\\1UL0123__"=========》b_\_\UL_\UL_\_UU_U_L_0_22_333______\UL_\UL
"\\34b_7__f5_z9_t2"========》\_4444_bbbbb_b_\UL__________\UL_\UL_f________\UL_z____________\UL_t_2public class Test {
public static void main(String[] args) {
String s1 = "__0a\\U\\3_4b\\\\";
String s2 = "\\23b_2__f4";
String s3 = "b\\__\\1UL0123__";
String s4 = "\\34b_7__f5_z9_t2";
System.out.println(s1+" ------> "+encode(s1));
System.out.println(s2+" ------> "+encode(s2));
System.out.println(s3+" ------> "+encode(s3));
System.out.println(s4+" ------> "+encode(s4));
System.out.println("----------------------------");
System.out.println(decode(encode(s4))+" : "+decode(encode(s4)).equals(s4));
System.out.println(decode(encode(s3))+" : "+decode(encode(s3)).equals(s3));
System.out.println(decode(encode(s2))+" : "+decode(encode(s2)).equals(s2));
System.out.println(decode(encode(s1))+" : "+decode(encode(s1)).equals(s1));
}
public static String encode(String str){
List<String> list = new ArrayList<String>();
for (int i = 0; i < str.length(); i++) {
list.add(str.substring(i, i+1));
}
StringBuilder sb = new StringBuilder();
int len = list.size();
for (int i = 0; i < len; i++) {
sb.append("_");
if("_".equals(list.get(i))){
sb.append("\\UL");
}else if(list.get(i).matches("^[0-9]$")){
Integer v = Integer.valueOf(list.get(i));
if(i<len-1&&v>0){
while(v>=0){
sb.append(list.get(i+1));
v--;
}
}else{
sb.append(list.get(i));
}
}else{
sb.append(list.get(i));
}
}
sb.delete(0, 1);
return sb.toString();
}
/**
* 1.如果有\UL 则转为_;
* 2.如果是重复的叠字,则转化为长度-1;
* @param str
* @return
*/
public static String decode(String str){
String[] s = str.split("_");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length; i++) {
if(s[i].equals("\\UL")){
sb.append("_");
}else if(isSame(s[i])){
sb.append(changeFromSame(s[i]));
}else if("".equals(s[i])){
int j=-1;
while(i<(s.length-1)&&"".equals(s[i++])){
j++;
}
i--;
sb.append(j-1).append("_");
}else{
sb.append(s[i]);
}
}
return sb.toString();
}
/**
* 如果是叠字,返回true,否则,返回false
* @param str
* @return
*/
public static boolean isSame(String str){
if(str == null || str.length() < 2){
return false;
}
char[] c = str.toCharArray();
for (int i = 0; i < c.length-1; i++) {
if(c[i] != c[i+1]){
return false;
}
}
return true;
}
/**
* 将叠字转化为指定类型的值
* @param str
* @return
*/
public static String changeFromSame(String str){
Integer len = str.length()-1;
return len.toString();
}
}代码如下:
输出结果如下:
__0a\U\3_4b\\ ------> \UL_\UL_0_a_\_U_\______\UL_bbbbb_b_\_\
\23b_2__f4 ------> \_333_bbbb_b_\UL_____\UL_\UL_f_4
b\__\1UL0123__ ------> b_\_\UL_\UL_\_UU_U_L_0_22_333______\UL_\UL
\34b_7__f5_z9_t2 ------> \_4444_bbbbb_b_\UL__________\UL_\UL_f________\UL_z____________\UL_t_2
----------------------------
\34b_7__f5_z9_t2 : true
b\__\1UL0123__ : true
\23b_2__f4 : true
__0a\U\3_4b\\ : true
本文介绍了如何用Java编程语言实现两个函数:encode()和decode()。这两个函数主要用于字符串的变换和复原操作。当字符串中出现下划线 '_' 时,encode() 函数将其替换为 '/UL',而 decode() 函数则负责将 '/UL' 解码回下划线。
1985

被折叠的 条评论
为什么被折叠?



