也可以查看我的个人博客,秋梨膏,(☆ω☆)
题目链接
题意:给出不超过1000行的字符,每行字符不超过180个字母,每一行中的␣代表一个空格,现在需要将每一列左对齐,请输出对其后的每一行。
思路:每次读取一行,再将每一个单词"取出来",之后存在对应一行的vector中,并且取出来之后更新该单词所在列的最大宽度,之后输出的时候,如果是第一列,直接输出即可,如果不是,那么要先输出len[j - 1] - v[i][j - 1].length() + 1个空格即可,其中i代表行数,j代表列数,v[i][j]代表vector中第i行第j个单词,len[j - 1]代表第j-1列的最大宽度
注意:需要将样例中的␣替换成空格
个人总结:getline的用法。。。。
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 200 , M = 1010;
string s;
int len[N];
vector <string> ss[M];
inline void init()//初始化函数,嫌麻烦可以直接将memset写在main里
{
memset(len , 0 , sizeof len);
}
int main(void)
{
init();
int row = 0;//记录有多少行
while(getline(cin , s))//这里用getline读取string,可以一次读取一行
{
int col = 0 , sLen = s.length();//col代表列,sLen代表当前字符串s的长度
for(int i = 0 ; i < sLen ; ++ i)//枚举每一个字符
{
if(s[i] != ' ')//如果不是空格,就代表有一个新的单词
{
int k = i;//k是单词的起始位置
string a = "";//a用于记录这个单词
//只要没有到末尾,并且也不是空格,就代表这个单词还有字幕
while(k < sLen && s[k] != ' ') a += s[k ++];
//这里别忘了更新i,因为最后k的大小肯定是空字符的位置或者sLen,所以需要-1
//这样在for循环的末尾i还会+1
i = k - 1;
//更新第col列的最大长度
len[col] = max(len[col] , (int)a.length());
col ++;
//将这个单词添加到第row行的末尾
ss[row].push_back(a);
}
}
//更新行数
row ++;
}
//枚举每一行
for(int i = 0 ; i < row ; ++ i)
{
//枚举该行的每一个单词
for(int j = 0 ; j < ss[i].size(); ++ j)
{
//如果是第一个单词,直接输出即可
if(j == 0) cout << ss[i][j];
else
{
//如果不是第一个单词,那么,就先输出空格,在输出单词
for(int k = 0 ; k < len[j - 1] - ss[i][j - 1].length() + 1 ; ++ k) cout << ' ';
cout << ss[i][j];
}
}
//换行
cout << endl;
}
return 0;
}