我有一个Java洗牌字符串算法。我已经有了改组后的字符串的输出和改组后的算法...
static String Validate(String f) {
StringBuilder str = new StringBuilder(f);
for (int i = 0; i < str.length(); i++) {
for (int j = i; j < str.length()-1; j++) {
char t = str.charAt(j);
str.setCharAt(j, str.charAt(j+1));
str.setCharAt(j + 1, t);
}
}
System.out.print(str);
return "" + str.toString();
}
并且输出字符串是...
lgcnyurVr34d0Df{__3_R}43na501
我的问题是:如何检索原始字符串?
答案 0 :(得分:2)
是的,可以恢复该过程。原始字符串为flag{c4n_y0u_r3V3r53_4ndR01D}
原始算法执行以下步骤:
0 0 ABCDEF
0 1 BACDEF
0 2 BCADEF
0 3 BCDAEF
0 4 BCDEAF
1 1 BCDEFA //A is at the end now
1 2 BDCEFA
1 3 BDECFA
1 4 BDEFCA
2 2 BDEFAC //C was at index 2 at the beginning of this outer loop iteration
2 3 BDFEAC
2 4 BDFAEC
3 3 BDFACE //now E went to the end of the String
3 4 BDFCAE
4 4 BDFCEA
要还原它,需要反转循环的方向和字母交换的方向。
static String reverseValidate(String reversed) {
StringBuilder str = new StringBuilder(reversed);
for (int i = str.length() - 1; i >= 1; i--) {
for (int j = str.length() - 1; j >= i; j--) {
char t = str.charAt(j);
str.setCharAt(j, str.charAt(j - 1));
str.setCharAt(j - 1, t);
}
}
return str.toString();
}
您发布的算法通过以下方式起作用: 对于字符串长度中的每个索引,它从该索引开始并将该字母移动到末尾。
要查看它,请尝试在内部循环中的某处打印System.out.println(i + " " + j + " " + str);
。