字符串输出对齐问题

问题描述:
  在线的笔试题,记得不是很清楚了,大概的如下:
1、第一行输入一个整数,代表字符串对齐输出的每行的大小(假设字体等大小),第二行输入一个行字符串,每个单词之间用一个空格分割。
2、分行输出后每行的末尾不能是空格,除了最后一行外必须是‘\n’,除最后一行外。
3、单词不能拆分。在前面的句子中增加空格的时候遵循大间隔在前,小间隔在后,且每个间隔之间的“间隔差”不能超过一。也就是空格数应该是3,3,2,1这种

问题分析:
  看到问题的第一想法是用一个队列存储输入的字符串,然后用根据需要输出的大小去取队列元素作为输出子串,然后判断子串最后一个字符的来分几种情况:
  1、是空格,则空格前一个为输出的结尾,并且在子串第一个空格地方增添空格
  2、是英文字母,首先判断后一个字符如果是空格,则子串直接输出。如果后一个不是空格,则查找自子串中最有一个空格的位置,计算需要增添的空格数目。然后又依照大间隔在前,小间隔在后的规则增加规则。
  3、非空格和英文字母(如符号等)。直接输出子串。
 
(好吧,这其实是一道前端的面试题,本来使用js来做的,然后我对js一点都不懂,就用c++ 来做了,就当作对于c++ 的string的相关函数的学习);
代码如下:

int main(int argc, char ** argv)
{
    using namespace std;
    int LineWidth =25;
    //cin >> LineWidth;
    //cin.ignore();
    string text;
    //getline(cin,text);
    text = "Company Profile 51 credit card was established in May 2012, the first to help users a key to manage credit card billing '51 credit card housekeeper' APP, has now developed into the management of China's largest credit card bill of lading mobile Internet companies with more than 70 million bank certified Quality users, management of China over active credit card bills.";
    bool isend = false;
    do
    {
        if (text.size() >= LineWidth)
        {
            string  outtxt;
            outtxt = text.substr(0, LineWidth);
            char pin = outtxt[outtxt.length() - 1];
            if (pin == ' ')
            {
                outtxt.erase(outtxt.length() - 1);
                int ix = outtxt.find_first_of(' ');
                outtxt.insert(ix, " ");
                text = text.substr(LineWidth,text.length()-1);          
            }else if (isalpha(pin))
            {
                if (text.size() == LineWidth|| text[LineWidth]==' ')
                {
                    text = text.substr(LineWidth,text.length()-1);
                }
                else
                {
                    int ix = outtxt.find_last_of(' ');
                    outtxt = text.substr(0, ix);
                    int addspace = LineWidth - outtxt.length();
                    int orispace = 0;
                    std::vector<int> indexspace;
                    for (int i = 0; i < outtxt.length(); i++)
                    {
                        if (outtxt[i] == ' ')
                        {
                            indexspace.push_back(i);
                            orispace++;
                        }
                    }
                    for (int k = 0,i=0; i < addspace; i++,k++)
                    {
                        if (k >=indexspace.size())
                        {
                            k = 0;
                        }
                        outtxt.insert(indexspace[k], " ");
                        for (int j=k+1;j<indexspace.size();j++)
                        {
                            indexspace[j]++;
                        }
                    }
                    text = text.substr(ix,text.length()-1);
                }
            }
            else
            {
                text = text.substr(LineWidth, text.length() - 1);
            }
            cout << outtxt<<'\n';
        }
        else if (text.size()>0)
        {
            cout << text;
            text.clear();
        }
        if (text.size()==0)
        {
            isend = true;
        }
    } while (!isend);


    //int wait;
    //cin >> wait;
}

输出的结果如下:
这里写图片描述

这里有一个问题,就是每个行的行头的空格没有去掉。因为主要是想学习一下string函数的用法,所以也就不改了,权当锻炼一下编程能力
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮尔菲特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值