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)
    }
}
相关推荐
剪一朵云爱着2 小时前
力扣2438. 二的幂数组中查询范围内的乘积
算法·leetcode
thusloop8 小时前
380. O(1) 时间插入、删除和获取随机元素
数据结构·算法·leetcode
緈福的街口9 小时前
【leetcode】584. 寻找用户推荐人
算法·leetcode·职场和发展
Maybyy9 小时前
力扣242.有效的字母异位词
java·javascript·leetcode
wjcurry9 小时前
完全和零一背包
数据结构·算法·leetcode
卜锦元10 小时前
Go中使用wire进行统一依赖注入管理
开发语言·后端·golang
mit6.82415 小时前
论容器化 | 分析Go和Rust做医疗的后端服务
docker·golang·rust
ykuaile_h815 小时前
Go 编译报错排查:vendor/golang.org/x/crypto/cryptobyte/asn1 no Go source files
后端·golang
科大饭桶15 小时前
数据结构自学Day5--链表知识总结
数据结构·算法·leetcode·链表·c
YuTaoShao18 小时前
【LeetCode 热题 100】24. 两两交换链表中的节点——(解法一)迭代+哨兵
java·算法·leetcode·链表