时间轴

2025-11-10

init


题目:

直接模拟,计算每一行能容纳多少个单词,每个单词后面有多少个空格。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <vector>
#include <string>
using std::vector;
using std::string;

class Solution {
public:
vector<string> fullJustify(vector<string> &words, int maxWidth)
{
int i, j, n = words.size();
int start = 0;
int curr_words_size;
int blank_space_num;
int word_space;
int line_word_num;
int extra_space;
vector<string> res;

while (start < n) {
// 计算当前行容下几个单词, 从start开始
curr_words_size = 0;
for (i = 0; start + i < n; i++) {
if (curr_words_size + words[start + i].size() + i <= maxWidth) { //加上空格
curr_words_size += words[start + i].size();
} else {
break;
}
}
// start .. start+i 一共i个单词
line_word_num = i;
// 空格数量
blank_space_num = maxWidth - curr_words_size;

string curr;
if (start + line_word_num >= n) { //最后一行
for (i = 0; i < line_word_num; i++) {
curr += words[start + i];
curr += ' ';
}
if (curr.size() != 0) { //去掉最后一个单词的空格
curr.pop_back();
}
// 剩下多少空格加到末尾
for (i = 0; i < blank_space_num - line_word_num + 1; i++) {
curr += ' ';
}
res.push_back(curr);
break;
}

if (line_word_num == 0) {
break;
} else if (line_word_num == 1) {
//只有一个单词
curr += words[start];
for (i = 0; i < blank_space_num; i++) {
curr += ' ';
}
} else if (line_word_num > 1) {
// 最后一个字母不需要空格,前面字母至少word_space个空格
word_space = blank_space_num / (line_word_num - 1);
extra_space = blank_space_num % (line_word_num - 1);
if (extra_space == 0) {
for (i = 0; i < line_word_num - 1; i++) {
curr += words[start + i];
for (j = 0; j < word_space; j++) {
curr += ' ';
}
}
} else {
for (i = 0; i < line_word_num - 1; i++) {
curr += words[start + i];
if (i < extra_space) {
curr += ' ';
}
for (j = 0; j < word_space; j++) {
curr += ' ';
}
}
}
//最后一个单词
curr += words[start + i];
}

res.push_back(curr);

start = start + line_word_num;
}

return res;
}
};

#include <stdio.h>
int main()
{
vector<string> words = { "Science", "is", "what", "we", "understand", "well",
"enough", "to", "explain", "to", "a", "computer.",
"Art", "is", "everything", "else", "we", "do" };
int maxWidth = 20;
Solution S;
vector<string> res = S.fullJustify(words, maxWidth);
vector<string> err;
for (string s : res) {
printf("%s\n", s.c_str());
if (s.size() != maxWidth) {
err.push_back(s);
}
}
if (err.size() != 0) {
printf("err line: \n");
}
for (string s : err) {
printf("line size: %d line: %s\n", s.size(), s.c_str());
}
}