如何使用Java 8实现指定规则的字符串序列解密?
字符串解密代码验证及优化建议
首先你的现有代码逻辑是正确的,使用提供的样例输入?85O89*69R65*87O104*33I1043运行,最终可得到预期输出Hi! How are you?。
优化建议
- 变量命名优化:现有单字符变量名无实际语义,替换为对应业务含义的命名,可大幅提升代码可读性。
- 冗余逻辑移除:无需将StringBuilder转为char数组再遍历,可直接遍历StringBuilder的字符;数字转ASCII的逻辑不需要拼接临时字符串再转整型,可直接通过数值计算得到ASCII码值,减少性能开销。
- 不必要的同步开销移除:反转字符串时使用的
StringBuffer是线程安全类,自带同步锁开销,单线程场景下替换为StringBuilder性能更优。 - 鲁棒性增强:现有逻辑默认输入末尾一定是字符
3,可增加前置校验,判断输入字符串非空且末尾为3再执行删除操作,避免非法输入导致数组越界异常。 - 中间对象减少:可以将多步操作合并到同一个StringBuilder中执行,减少不必要的String、StringBuffer/Builder中间对象创建,降低GC压力。
优化后代码示例
public String deciphering(String ciphered) { // 入参合法性校验 if (ciphered == null || ciphered.isEmpty() || ciphered.charAt(ciphered.length() - 1) != '3') { throw new IllegalArgumentException("非法的加密字符串输入"); } // 第一步:移除末尾的3 StringBuilder content = new StringBuilder(ciphered.substring(0, ciphered.length() - 1)); // 合并第二步(数字簇转ASCII)和第三步(*替换为空格),减少一次遍历开销 StringBuilder converted = new StringBuilder(); int len = content.length(); for (int i = 0; i < len; i++) { char cur = content.charAt(i); if (Character.isDigit(cur)) { int asciiNum = 0; while (i < len && Character.isDigit(content.charAt(i))) { asciiNum = asciiNum * 10 + (content.charAt(i) - '0'); i++; } i--; // 回退循环多偏移的一位下标 converted.append((char) asciiNum); } else if (cur == '*') { converted.append(' '); } else { converted.append(cur); } } // 合并第四步(反转字符串)和第五步(大小写互换) converted.reverse(); for (int i = 0; i < converted.length(); i++) { char c = converted.charAt(i); if (Character.isLowerCase(c)) { converted.setCharAt(i, Character.toUpperCase(c)); } else if (Character.isUpperCase(c)) { converted.setCharAt(i, Character.toLowerCase(c)); } } return converted.toString(); }
内容的提问来源于stack exchange,提问作者Biswaroop
相关产品推荐
相关产品推荐

