当前位置: 首页 > news >正文

leetcode68.左右文本对齐

 思路源自

leetcode-字符串篇 68题 文本左右对齐

 难度高的模拟类型题目,关键点在于事先知道有多少单词要放在本行并且还要知道本行是不是最后一行(最后一行需要全部单空格右对齐,不是最后一行就空格均摊),非最后一行的空格要尽可能平等的均摊在相邻单词间的空隙内

class Solution {

    private String fillWords(String[] words, int begin, int end, int maxWidth, boolean lastLine) {
        int wordCount = end - begin + 1;
        //除去每一个单词尾部空格和单词本身长度看看多余多少空格
        int extraSpace = maxWidth + 1 - wordCount;
        for(int i=begin;i<=end;i++)
            extraSpace-=words[i].length();
        //额外空格的平均值
        int extraSpaceAvg = wordCount > 1 ? extraSpace / (wordCount - 1) : 1;
        //额外空格的余数
        int extraSpaceExtra = wordCount > 1 ? extraSpace % (wordCount - 1) : 0;
        //装填数据,先装填前n-1个,最后一个特殊处理
        StringBuilder stringBuilder = new StringBuilder();
        for(int i=begin;i<end;i++){
            stringBuilder.append(words[i]);
            if (lastLine) {
                stringBuilder.append(" ");
                continue;
            }
            //单词后的空格个数为基本的1个加上平均的再加上多余的
            int n = 1 + extraSpaceAvg + (i - begin < extraSpaceExtra ? 1 : 0);
            while (n-->0)
                stringBuilder.append(" ");
        }
        //填入最后一个单词和它的空格
        stringBuilder.append(words[end]);
        while (stringBuilder.length()<maxWidth)
            stringBuilder.append(" ");
        return stringBuilder.toString();
    }

    public List<String> fullJustify(String[] words, int maxWidth) {
        List<String> result = new ArrayList<>();
        int countLen = 0;//统计当前的单词组是否超过maxWidth
        int begin = 0;//单词组的起始单词索引
        for (int i = 0; i < words.length; i++) {
            countLen += words[i].length() + 1;
            //如果是最后一个单词,或者加上下一个单词就超过长度,那么可以凑成一行
            if (i + 1 == words.length || countLen + words[i + 1].length() > maxWidth) {
                result.add(fillWords(words, begin, i, maxWidth, i + 1 == words.length));
                begin = i + 1;
                countLen = 0;
            }
        }
        return result;
    }
}

相关文章:

  • 《DeepSeek RAG 增强检索知识库系统》Ollama RAG 知识库上传、解析和验证之四
  • mysql 禁止 读 某个 表
  • 第18章:基于Global Context Vision Transformers(GCTx_unet)网络实现的oct图像中的黄斑水肿和裂孔分割
  • 【Audio开发三】音频audio中帧frameSize ,周期大小periodsize,缓冲区buffer原理详解以及代码流程分析
  • 《嵌入式开发实战:基于Linux串口的LED屏显系统设计与实现》
  • Clickhouse试用单机版部署
  • 【完整可用】使用openhtmltopdf生成PDF(带SVG)
  • 策略模式结合模板方法模式
  • Go语言入门-反射4(动态构建类型)
  • PyCharm Community社区版链接WSL虚拟环境
  • 【笔记ing】AI大模型-01大模型基础综述
  • 医学科研工作者的AI助手:高效生成文献结构图和实验流程图
  • U9新开发webapi无授权
  • 使用Docker创建postgres
  • 智慧医院室内导航系统架构拆解:技术选型与性能攻坚指南
  • ssh警告WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!‌的解决方法
  • 2025 年“认证杯”数学中国数学建模网络挑战赛 A题 小行星轨迹预测
  • Mac 关闭浏览器左右滑动切换页面的问题
  • Java常用安全编码的规范整理及工具
  • jQuery UI 小部件方法调用详解
  • 微云做网站/淘宝一个关键词要刷多久
  • 成都个人网站制作公司/赚钱软件
  • 开发者导航/百度seo通科
  • 哪个网站的体验做的最好/搜狗搜索推广
  • 免费做app和网站的平台有哪些/西安seo和网络推广
  • 淘宝联盟网站备案/营销手段有哪些