要求
给你一个 rows x cols 的屏幕和一个用 非空 的单词列表组成的句子,请你计算出给定句子可以在屏幕上完整显示的次数。
注意:
- 一个单词不能拆分成两行。
- 单词在句子中的顺序必须保持不变。
- 在一行中 的两个连续单词必须用一个空格符分隔。
- 句子中的单词总量不会超过 100。
- 每个单词的长度大于 0 且不会超过 10。
- 1 ≤ rows, cols ≤ 20,000.
示例 1:
输入:
rows = 2, cols = 8, 句子 sentence = ["hello", "world"]
输出:
1
解释:
hello---
world---
字符 '-' 表示屏幕上的一个空白位置。
示例 2:
输入:
rows = 3, cols = 6, 句子 sentence = ["a", "bcd", "e"]
输出:
2
解释:
a-bcd-
e-a---
bcd-e-
字符 '-' 表示屏幕上的一个空白位置。
示例 3:
输入:
rows = 4, cols = 5, 句子 sentence = ["I", "had", "apple", "pie"]
输出:
1
解释:
I-had
apple
pie-I
had--
字符 '-' 表示屏幕上的一个空白位置。
核心代码
class Solution:
def wordsTyping(self, sentence: List[str], rows: int, cols: int) -> int:
ln = [len(s) for s in sentence]
n = len(ln)
# 所有单词长度(加上空格,最后单词也有)
all_len = sum(ln) + n
idx = 0
# 结果
res = 0
for i in range(rows):
remain_col = cols
while remain_col > 0:
if ln[idx] <= remain_col:
remain_col -= ln[idx]
if remain_col > 0:
remain_col -= 1
idx += 1
if idx == n:
div,mod = divmod(remain_col,all_len)
res += div + 1
remain_col = mod
idx = 0
else:
break
return res
解题思路:模拟过程,关键一点就是 用除法方法判断一行剩余的位置能放几个句子,循环执行了一遍,对于这个if idx == n:
及下面的代码的理解,我们是想判断,在这一行中剩下的位置够不够放下一个句子,并且此时,我们的已经可以显示一遍完整的数据信息,然后我们在将idx置为0,直接可以下次循环遍历整个列表,到此不断循环下去就可以知道能完整显示几次数据信息。