You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现字符权重计算并截取对应最后12权重字符问题求助

问题分析

你的代码逻辑完全偏离需求,核心问题包括:

  1. 循环中破坏原字符串:每次循环都将song重写为长度+计数的拼接字符串,彻底丢失了原输入的字符信息,最后处理的根本不是目标字符串
  2. 空格判断逻辑错误:song.contains(" ")是检查整个字符串是否含空格,而非当前字符是否为空格,导致只要字符串有空格,所有非大写字符都会触发空格计数
  3. 计数逻辑错误:遇到小写字母时直接重置两个计数器为0,完全不符合权重累加的要求
  4. 未实现权重累计与截取逻辑:整个代码没有统计字符权重的累计值,更没有根据累计权重定位到最后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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:25:32