Golang | Leetcode Golang题解之第68题文本左右对齐

题目:

题解:

Go 复制代码
// blank 返回长度为 n 的由空格组成的字符串
func blank(n int) string {
    return strings.Repeat(" ", n)
}

func fullJustify(words []string, maxWidth int) (ans []string) {
    right, n := 0, len(words)
    for {
        left := right // 当前行的第一个单词在 words 的位置
        sumLen := 0   // 统计这一行单词长度之和
        // 循环确定当前行可以放多少单词,注意单词之间应至少有一个空格
        for right < n && sumLen+len(words[right])+right-left <= maxWidth {
            sumLen += len(words[right])
            right++
        }

        // 当前行是最后一行:单词左对齐,且单词之间应只有一个空格,在行末填充剩余空格
        if right == n {
            s := strings.Join(words[left:], " ")
            ans = append(ans, s+blank(maxWidth-len(s)))
            return
        }

        numWords := right - left
        numSpaces := maxWidth - sumLen

        // 当前行只有一个单词:该单词左对齐,在行末填充剩余空格
        if numWords == 1 {
            ans = append(ans, words[left]+blank(numSpaces))
            continue
        }

        // 当前行不只一个单词
        avgSpaces := numSpaces / (numWords - 1)
        extraSpaces := numSpaces % (numWords - 1)
        s1 := strings.Join(words[left:left+extraSpaces+1], blank(avgSpaces+1)) // 拼接额外加一个空格的单词
        s2 := strings.Join(words[left+extraSpaces+1:right], blank(avgSpaces))  // 拼接其余单词
        ans = append(ans, s1+blank(avgSpaces)+s2)
    }
}
相关推荐
XMYX-06 小时前
17 - Go 通道 Channel 底层原理 + 实战详解
开发语言·golang
cpp_25016 小时前
P2347 [NOIP 1996 提高组] 砝码称重
数据结构·c++·算法·题解·洛谷·noip·背包dp
加农炮手Jinx7 小时前
LeetCode 146. LRU Cache 题解
算法·leetcode·力扣
加农炮手Jinx7 小时前
LeetCode 128. Longest Consecutive Sequence 题解
算法·leetcode·力扣
旖-旎8 小时前
递归(汉诺塔问题)(1)
c++·学习·算法·leetcode·深度优先·递归
JAVA学习通8 小时前
励志从零打造LeetCode平台之C端竞赛列表
java·vscode·leetcode·docker·状态模式
莫等闲-8 小时前
代码随想录一刷记录Day31——leetcode56. 合并区间 738.单调递增的数字
数据结构·c++·算法·leetcode
剑挑星河月9 小时前
45.跳跃游戏Ⅱ
数据结构·算法·leetcode
Tisfy10 小时前
LeetCode 3783.整数的镜像距离:数学
数学·算法·leetcode·题解
水蓝烟雨10 小时前
0010.三数之和
数据结构·算法·leetcode