使用Java 8破译序列



解密信息的步骤

  1. 删除字符串末尾的3
  2. 用对应的字符值替换偶数位置(数字簇)的ASCII值。
  3. 用空格&quot代替*;"。
  4. 反转字符串
  5. 将字符串的大小写转换为大写,反之亦然。

样本输入:?85O89*69R65*87O104*33I1043输出要求:Hi! How are you?这是我写的全部方法。

public String deciphering(String ciphered) {
StringBuilder a = new StringBuilder(ciphered);
StringBuilder b = a.deleteCharAt(a.length()-1);
char[] ch = new char[b.length()];
StringBuilder c = new StringBuilder();
for (int i = 0; i < b.length(); i++) {
ch[i] = b.charAt(i);
}
for (int i = 0; i < ch.length; i++) {
if(!Character.isDigit(ch[i]))
{
c.append(ch[i]);
}else
{
String temp = new String();
while(Character.isDigit(ch[i]) &&(i<b.length())){
temp = temp + ch[i];
i++;
}
int number = Integer.parseInt(temp);
char p = (char)number;
c.append(p);
}
}
String d = c.toString();
String e = d.replace('*', ' ');
StringBuffer f = new StringBuffer(e);
StringBuffer g = f.reverse();
for (int i = 0; i < g.length(); i++) {
if (Character.isLowerCase(g.charAt(i))){
char x = Character.toUpperCase(g.charAt(i));
g.setCharAt(i, x);
} else if (Character.isUpperCase(g.charAt(i))) {
char x = Character.toLowerCase(g.charAt(i));
g.setCharAt(i, x);
}
}
return g.toString();
}

当你退出内部循环时,i将索引第一个非数字字符,然后当你到达for循环体的末尾时,for循环将再次对i进行递增。

最好将输入字符串分成带有非数字分隔符的部分,并在删除最后一个字符后使用以下正则表达式保留分隔符(使用这里描述的向前查找和向后查找):

str.substring(0, str.length() - 1).split("(?<=\D)|(?=\D)")

然后可以使用流API将每个字符串转换为一个单独的字符,并将这些字符插入到准备好的StringBuilder中,以在结果中实现反向顺序:

public static String decipher(String str) {

StringBuilder sb = new StringBuilder(str.length());

Arrays.stream(
str.substring(0, str.length() - 1).split("(?<=\D)|(?=\D)")
)
.map(p -> p.matches("\d+") ? (char) Integer.parseInt(p): p.charAt(0))
.map(c -> c == '*' ? ' ' 
: Character.isLowerCase(c) ? Character.toUpperCase(c) 
: Character.isUpperCase(c) ? Character.toLowerCase(c)
: c
)
.forEach(c -> sb.insert(0, c));

return sb.toString();
}

测试:

System.out.println(decipher("?85O89*69R65*87O104*33I1043"));

输出:

Hi! How are you?

最新更新