day10(11.7)——leetcode面试经典150

68. 文本左右对齐​​​​​​

这道题好繁琐啊,我的思路是一个一个单词判断,每一个都加上两个单词之间的空格去看长度是否超过maxWidth,如果超过了,进行判断,只有一个单词或者到了最后一行,直接左对齐,后面填充空格,超过一个单词,进行计算每个单词之间的空格的个数,进行填充,一个一个累加,最后加入最终的结果列表。

但是真的一个不小心就容易写错......

68. 文本左右对齐

题目:

题解:

java 复制代码
class Solution {
    public List<String> fullJustify(String[] words, int maxWidth) {
        List<String> result = new ArrayList<>();
        int n = words.length;
        int i = 0;

        while (i < n) {
            // 1. 找出当前行能放哪些单词 [i, j)
            int j = i;
            int lineLength = 0; // 只算单词长度,不算空格

            while (j < n && lineLength + words[j].length() + (j - i) <= maxWidth) {
                lineLength += words[j].length();
                j++;
            }

            // 2. 处理这一行
            int wordCount = j - i;
            int spaces = maxWidth - lineLength; // 总共要填充的空格数

            StringBuilder line = new StringBuilder();

            if (j == n || wordCount == 1) {
                // 最后一行 或 只有一个单词:左对齐
                for (int k = i; k < j; k++) {
                    line.append(words[k]);
                    if (k < j - 1) line.append(" ");
                }
                // 末尾补空格
                while (line.length() < maxWidth) {
                    line.append(" ");
                }
            } else {
                // 中间行:两端对齐
                int avgSpaces = spaces / (wordCount - 1);
                int extraSpaces = spaces % (wordCount - 1);

                for (int k = i; k < j; k++) {
                    line.append(words[k]);
                    if (k < j - 1) {
                        // 添加基础空格
                        for (int s = 0; s < avgSpaces; s++) {
                            line.append(" ");
                        }
                        // 前 extraSpaces 个间隙多加一个空格
                        if (k - i < extraSpaces) {
                            line.append(" ");
                        }
                    }
                }
            }

            result.add(line.toString());
            i = j; // 移动到下一行
        }
        return result;
    }
}
相关推荐
聪明的笨猪猪33 分钟前
AI应用架构选型:架构师的核心决策困境与权衡
经验分享·面试·架构
疯华整猫3 小时前
被杀掉之后:我把 Android 的「唤起 + 常驻」重做了一遍
前端·面试·架构
nice_lcj5203 小时前
Java 并发容器入门:ConcurrentHashMap、CopyOnWriteArrayList、阻塞队列
java·面试·并发编程·阻塞队列·concurrenthashmap·copyonwritearraylist
岁月宁静15 小时前
AI 应用开发工程师简历怎么写:HR 初筛、技术复筛、面试追问,三道关卡各看什么?
人工智能·python·面试
Dream it possible!18 小时前
LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)
算法·leetcode·面试·动态规划
yeccheng21 小时前
MySQL 索引超详解:从底层 B+ 树到面试高频考点
java·开发语言·jvm·mysql·面试
j7~1 天前
【C++ 八股文】(篇四)C++11 新特性
开发语言·c++·面试·c++11·八股文
nice_lcj5202 天前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试
nice_lcj5202 天前
ThreadLocal 入门:它是怎么隔离数据的、为什么会导致内存泄漏
java·开发语言·后端·面试·并发编程·内存泄漏·threadlocal
Yuzhiyuxia2 天前
【AI Agent面试系列】上下文管理1
人工智能·面试·职场和发展