Alignment of Code

也可以查看我的个人博客,秋梨膏,(☆ω☆)
题目链接

题意:给出不超过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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值