实现两个函数encode()和decode()

来源:互联网 发布:mac取消钥匙串密码 编辑:程序博客网 时间:2024/06/01 09:26
今天去面试,碰到一个机试题,当时制作出来了正向转换,逆向的没做出来,回来以后,查了下网络,也是正向转换有答案,可是最难的逆向的还是没找到,花了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_2

public 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_4b\__\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 : trueb\__\1UL0123__ : true\23b_2__f4 : true__0a\U\3_4b\\ : true


原创粉丝点击