Java实现字符权重计算并截取对应最后12权重字符问题求助
问题分析
你的代码逻辑完全偏离需求,核心问题包括:
- 循环中破坏原字符串:每次循环都将
song重写为长度+计数的拼接字符串,彻底丢失了原输入的字符信息,最后处理的根本不是目标字符串 - 空格判断逻辑错误:
song.contains(" ")是检查整个字符串是否含空格,而非当前字符是否为空格,导致只要字符串有空格,所有非大写字符都会触发空格计数 - 计数逻辑错误:遇到小写字母时直接重置两个计数器为0,完全不符合权重累加的要求
- 未实现权重累计与截取逻辑:整个代码没有统计字符权重的累计值,更没有根据累计权重定位到最后12权重对应的字符范围
修复后的代码
采用反向遍历的方式,从字符串末尾开始累加权重,直到累计值达到12,即可精准定位需要截取的起始位置:
public static String getLast12WeightChars(String song) { int totalWeight = 0; int startIndex = song.length(); // 从末尾往前遍历,累加权重直到达到12 for (int i = song.length() - 1; i >= 0; i--) { char currentChar = song.charAt(i); int charWeight = Character.isUpperCase(currentChar) ? 2 : 1; // 若加上当前字符权重会超过12,跳过(保证取到刚好最后12权重的部分) if (totalWeight + charWeight > 12) { continue; } totalWeight += charWeight; startIndex = i; // 累计权重达标,停止遍历 if (totalWeight == 12) { break; } } return song.substring(startIndex); } // 测试示例 public static void main(String[] args) { String input = "edcdeeE ddDeeEedcdeeE eddedC"; System.out.println(getLast12WeightChars(input)); // 输出: eeE eddedC }
代码说明
- 反向遍历避免了从开头累加所有权重的冗余操作,效率更高
- 严格按照规则计算每个字符的权重:大写字母权重2,小写字母、空格权重1
- 当累计权重达到12时停止遍历,此时的
startIndex就是最后12权重对应的起始位置,截取该位置到末尾的子串即为结果
内容的提问来源于stack exchange,提问作者user46382
相关产品推荐
相关产品推荐

