【题目链接】
【题目考点】
1. 字符串
【解题思路】
解法1:保存一行已经占用的字符数
设h为当前行已经占用的字符数。
第一个单词直接加入,后面加入单词时要包括单词前面的空格,所以每次加入单词后,已经占用的字符增加:单词长度+1。
- 如果h为0,输出该单词,h只增加一个单词的长度。
- 如果h加上当前单词长度+1后,大于80个字符,则该单词应该放在下一行。换行,输出该单词,而后h变为当前单词长度。
- 其他情况,输出空格与该单词,h增加单词长度+1。
解法2:保存一行剩余的字符数
设r为当前行剩余的可以添加的字符数。
第一个单词直接加入,后面加入单词时要包括单词前面的空格,所以每次加入单词后,剩余的字符数减少:单词长度+1。
- 如果r为80,输出一个单词,r只减少一个单词的长度。
- 如果r减去当前单词长度+1后小于0,则该单词应该放在下一行。换行,输出该单词,而后r变为80减去当前单词长度。
- 其他情况,输出空格与该单词,r减少:单词长度+1。
可以一边遍历一边输出。也可以先构造字符串,最后输出。
【题解代码】
解法1:保存一行已经占用的字符数+构造字符串
#include<bits/stdc++.h>
using namespace std;
#define L 80 //一行长度
int main()
{
string s[1005], ans;
int n, h = 0;//h:已有字符数
cin >> n;
for(int i = 1; i <= n; ++i)
cin >> s[i];
for(int i = 1; i <= n; ++i)
{
if(h == 0)
{
ans = ans + s[i];
h += s[i].length();
}
else if(h+s[i].length()+1 <= L)
{
ans = ans + ' ' + s[i];
h += s[i].length()+1;
}
else//h+s.length()+1 > L
{
ans = ans + '\n' + s[i];
h = s[i].length();
}
}
cout << ans;
return 0;
}
解法2:保存一行剩余的字符数+直接输出
#include<bits/stdc++.h>
using namespace std;
#define L 80 //一行长度
int main()
{
string s;
int n, r = L;//r:剩余字符数
cin >> n;
for(int i = 1; i <= n; ++i)
{
cin >> s;
if(r == L)
{
cout << s;
r -= s.length();
}
else if(r >= s.length()+1)
{
cout << ' ' << s;
r -= s.length()+1;
}
else// r < s.length()+1
{
cout << endl << s;
r = L - s.length();
}
}
return 0;
}