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

本文介绍了如何用Java编程语言实现两个函数:encode()和decode()。这两个函数主要用于字符串的变换和复原操作。当字符串中出现下划线 '_' 时,encode() 函数将其替换为 '/UL',而 decode() 函数则负责将 '/UL' 解码回下划线。
今天去面试,碰到一个机试题,当时制作出来了正向转换,逆向的没做出来,回来以后,查了下网络,也是正向转换有答案,可是最难的逆向的还是没找到,花了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_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


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值