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)
    }
}
相关推荐
源代码•宸4 分钟前
Golang原理剖析(string面试与分析、slice、slice面试与分析)
后端·算法·面试·golang·扩容·string·slice
chillxiaohan24 分钟前
GO学习踩坑记录
开发语言·学习·golang
Logan Lie1 小时前
Go 反射(Reflection)详解:从入门到实践
开发语言·后端·golang
漫随流水1 小时前
leetcode算法(559.N叉树的最大深度)
数据结构·算法·leetcode·二叉树
爱编程的小吴2 小时前
【力扣练习题】151. 反转字符串中的单词
java·算法·leetcode
菜鸟233号2 小时前
力扣474 一和零 java实现
java·数据结构·算法·leetcode·动态规划
不知名XL2 小时前
day22 回溯算法part04
算法·leetcode·职场和发展
夏鹏今天学习了吗3 小时前
【LeetCode热题100(77/100)】杨辉三角
算法·leetcode·职场和发展
求梦8203 小时前
【力扣hot100题】搜索二维矩阵II(16)
算法·leetcode·矩阵
TDengine (老段)3 小时前
TDengine Go 语言连接器进阶指南
大数据·数据库·物联网·golang·时序数据库·tdengine·涛思数据