实现两个函数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
- 实现两个函数encode()和decode()
- python encode和decode函数
- python encode和decode函数说明
- python encode和decode函数说明
- python encode和decode函数说明
- python encode和decode函数说明
- python encode和decode函数说明
- python encode和decode函数说明
- python encode和decode函数说明
- python encode和decode函数说明
- python encode和decode函数说明
- python encode和decode函数说明
- python encode和decode函数说明
- python encode和decode函数说明
- 转载:python encode和decode函数说明
- python2 encode和decode函数说明
- python encode和decode函数说明
- python encode和decode函数说明
- SQL 中ROLLUP ,cube用法
- Fedora安装配置Latex 2012中文环境
- javascript比较两个日期相差天数
- Android自动化工具Monkeyrunner使用(七) ——在linux环境ubuntu平台上使用Eclipse运行monkeyrunne
- 观察者模式
- 实现两个函数encode()和decode()
- 使用 dd 命令创建磁盘镜像
- 利用DOM解析xml文件
- android listview的HeadView左右切换图片(仿新浪,网易,百度等切换图片)
- 网址总结
- Linux常用命令手册
- Android四种模式
- EIGRP实验--协议工作过程详解(一)
- Mysql 8小时问题