字符串输出对齐问题
程序员文章站
2022-07-13 23:25:12
...
问题描述:
在线的笔试题,记得不是很清楚了,大概的如下:
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函数的用法,所以也就不改了,权当锻炼一下编程能力