读书人

一路面试题(encode和decode)

发布时间: 2013-09-28 10:01:20 作者: rapoo

一道面试题(encode和decode)

前几天面试的一家小公司,公司不大,只有五六十个人,是一个和华夏基金合作做金融的产业的,公司不大,但特别无语的是他要求笔试,还面试好几次,我是我同学叫我过去的。给了一道编程题和一大堆图形推理题,全是逻辑题。编程题两个小时之内做完,我做了一个多小时,结果是做出来了,但好说我考虑的点还不够全。现题目和改进后的代码分享如下:

题目

请您用java语言实现两个函数encode()和decode(),分别实现对字符串的变换和复原.变换函数encode()顺序考察已知字符串的字符,按以下规则逐组生成新字符串:

(1)若已知字符串的当前字符不是大于0的数字字符,则复制该字符于新字符串中;

(2)若已知字符串的当前字符是一个数字字符,且它之后没有后继字符,则简单地将它复制到新字符串中;

(3)若已知字符串的当前字符是一个大于0的数字字符,并且还有后继字符,设该数字字符的面值为n,则将它的后继字符(包括后继字符是一个数字字符)重复复制n+1次到新字符串中;

(4)以上述一次变换为一组,在不同组之间另插入一个下划线'_'用于分隔;

(5)若已知字符串中包含有下划线'_',则变换为 ”\UL” 。

复原函数decode()做变换函数encode()的相反的工作.按照上述规则逆运算,变回原来的字符串。

例如:encode()函数对字符串24ab_2t2的变换结果为 444_aaaaa_a_b_\UL_ttt_t_2

说明:

题目的条件一有歧义,一种理解是:当前字符是一个小于等于0的数字字符;第二种理解是当前字符是一个除了1-9的任意字符。

我是基于第二种意思理解进行的解答。

假设字符为String str, n = str.length(); 当前字符为c = str[i]

一、进行encode()判断的条件:

(1)、c是等于0的数字 复制该字符

c是一般字符,且不为”_” 复制该字符

以上两个条件等同于:c是一个除了1-9,除了”_”的任意字符

(5)、c是一般字符,且为”_” 转换为”\Ul”

(2)、c是数字,且i=n-1 复制该字符

(3)、c是数字,且i<n-1,且c>0 复制(k+1)次后面的一个字符

以上四个条件拆分如下:

c == 0 i==n-1 复制该字符

i!=n-1 复制该字符

c是1-9的数字, 且i=n-1 复制该字符

且i<n-1 复制(k+1)次后面的一个字符

c是一般字符,且为”_” 转换为”\Ul”

c是一般字符,且不为”_” 转换为”\Ul”

再化为如下判断条件:

c是1-9的数字, 且i<n-1 复制(k+1)次后面的一个字符

c除1-9,且为”_” 转换为”\Ul”

其余 复制该字符

(4)、每个字符译码结束后加一个下划线”_”

二、进行decode()判断的条件:

思路:

根据规则4,用先将str用str.split("_");分成n个String数组strs[].

n = strs.lenth k = strs[i].length()

由encode()得到的译码如下:

c是1-9的数字, 且i<n-1 复制(k+1)次后面的一个字符 多个字符

c除1-9,且为”_” 转换为”\Ul” 多个字符

其余 复制该字符 一个字符

判断条件为:

A、k==1, 将该字符原样复原

B、k>1, strs[i] == ”\Ul”, 转换为”_”

strs[i] != ”\Ul”, 转换为k(k = strs[i].length()-1)

代码:
Encode函数输入以下用例:

24ab_2t2

444_aaaaa_a_b_\UL_ttt_t_2

04ab_2t2

0_aaaaa_a_b_\UL_ttt_t_2

1a0b_2t2

aa_a_0_b_\UL_ttt_t_2


aaab_2t2

a_a_a_b_\UL_ttt_t_2

24ab_2335t2

444_aaaaa_a_b_\UL_333_3333_5555_tttttt_t_2

240ab_

444_00000_0_a_b_\UL

读书人网 >编程

热点推荐