这是一个面试问题。我在想java中的解决方案。这个问题看起来很简单,这里有一个问题吗?
我在考虑以下解决方案:
string1 + 1*hash(String1) + string2 + 2*hash(String2).
如果我连接这样的字符串,那么我可以很容易地将它们解码为2个单独的字符串。
我在问题中遗漏了什么吗?
答案 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];