将两个字符串编码/解码为一个字符串,然后返回两个字符串

时间:2015-07-04 23:47:54

标签: java string decode encode

这是一个面试问题。我在想java中的解决方案。这个问题看起来很简单,这里有一个问题吗?

我在考虑以下解决方案:

string1 + 1*hash(String1) + string2 + 2*hash(String2).

如果我连接这样的字符串,那么我可以很容易地将它们解码为2个单独的字符串。

我在问题中遗漏了什么吗?

3 个答案:

答案 0 :(得分:1)

编码:

String encoded = new JsonArray().add(str1).add(str2).toString();

解码:

JsonArray arr = JsonArray.readFrom(encoded);
String str1 = arr.get(0).asString();
String str2 = arr.get(1).asString();

这里我使用minimal-json lib,但它与任何其他JSON库非常相似。

请注意,发现将信息编码到字符串中的新格式通常是一个坏主意,因为您已经解决了许多现有问题(xml,json,yaml等)已经解决了所有可能的问题,例如符号转义和异常处理

答案 1 :(得分:0)

编码:

String encoded = ""+str1.length()+"/"+str1+str2;

解码:

String[] temp = encoded.split("/", 2);
int length1 = Integer.parseInt(temp[0]);
String str1 = temp[1].substring(0, length1);
String str2 = temp[1].substring(length1);

说明:
编码字符串的格式为"<number>/<str1><str2>"。当您致电split(regex, limit)时,结果数组的大小最多为limit,仅考虑regex的第一个匹配项。因此,即使您的字符串包含字符/,您也可以确保生成的数组为{"<number>", "<str1><str2>"}
substring(begin, end)返回一个字符串,从begin 包含开始,以end 独占结尾,为您提供{{1}的结果子字符串}} 长度。由于您使用值end-begin调用它,因此您获得的正是(0, str1.length())。最后一次调用将从str1返回一个子字符串,该字符串也是str1.length()的第一个字符的索引,到字符串的末尾(这是str2的结尾)。登记/> 参考:String javadoc page

答案 2 :(得分:0)

一种方法是使用第一个字符串的长度。

// encode
String concat = string1 + string2;

// decode
String str1 = concat.substring( 0, string1.length() );
String str2 = concat.substring( string1.length(), concat.length() );

另一种方法是使用分隔符。但分隔符字符不应包含在要连接的任何字符串中。

// encode
String concat = "hello" + "`" + "world!";

// decode
String[] decoded = concat.split("`");
String str1 = decoded[0];
String str2 = decoded[1];