Text Justification 实现两端对齐功能
实现office word中的两端对齐功能。
只有个单词时,右边补齐空格。最后一行每个词间一个空格,整下的空格右边补齐。给定字符串,和每行的字符数L。进行两端对齐输出。
我的思路是写一个函数,给定相应的参数就返回该行的string。然后在主函数里只要负责给参数就好了。参数包括words字符串数组本身,然后每个字符串的长度数组。开始start记录从字符串数组只的那个词开始,end记录到哪个词结束。L就是每行的最大字符数。在子函数里实现如果是最后一个单词了,那么就每个词空一个空格。其余后面补齐。在主函数里通过记录start到目前的长度是否等于或者超过L来判断start和end。如果end超过了长度就结束,返回结果即可。代码有点复杂。将近100行。调了9次bug终究AC了。
class Solution {
public:
// 给定相应的参数,返回该行字符串满足右对齐
string fun68(vector<string> &words, int len[], int start, int end, int L)
{
if(start == end)
{
string subans = words[start];
for (int i = ; i < L - len[start]; ++i)
subans += ' ';
return subans;
}
string ans = "";
int tolen = , inter = ; // 词的长度tolen,两个词之间的空格inter
for (int i = start; i <= end; i++)
{
tolen += len[i];
}
int left = L - tolen;
inter = left / (end - start);
int times = left - inter * (end - start);//剩times个空格需要在前times个词间加一个空格
if(end == words.size() -) // 如果是最后一个了,那么每个单词空一格单词,剩下的空格放在最后边
{
for (int i = start; i < words.size() - ; i++)
{
ans += words[i] + ' ';
}
ans += words[end];
left -= (end - start);
for (int i = ; i < left; i++)
ans += ' ';
}
else // 否则就是平均分空格
{
for (int i = start; i <start + times; ++i)
{
ans += words[i];
for (int j = ; j < inter + ; ++j)
{
ans += " ";
}
}
for (int i = start + times; i < end; ++i) // 多出来的不能平均分的空格从左边开始分
{
ans += words[i];
for (int j = ; j < inter; ++j)
{
ans += " ";
}
}
ans += words[end];
}
return ans;
}
//主函数
vector<string> fullJustify(vector<string> &words, int L)
{
vector<string> ans;
if (words.size() == )
{
return ans;
}
int n = words.size();
int *len = new int[n];
for (int i = ; i < n; ++i)
{
len[i] = words[i].size();
}
int sum1 = len[], sum2 = , start = , end = ; // sum1记录从start开始的词到end的包括空格的长度
string tmp = "";
while ()
{
if (sum1 == L || sum1 + == L) // 如果有满足刚好等于L,那么就是要输出一行了
{
ans.push_back(fun68(words, len, start, end, L));
start = end + ;
end = end + ;
if(end < n)// 没输出一行要相应的该sum的值,相当于重新计算过
{
sum1 = len[end];
sum2 = ;
continue;
}
else
break;
}
else if (end + < n)
sum2 = sum1 + + len[end + ];
else
{
ans.push_back(fun68(words, len, start, end, L));
break;
}
if (sum1 < L && sum2 > L) // 说明到end应结束一行
{
ans.push_back(fun68(words, len, start, end, L));
start = end + ;
end = start;
sum1 = len[end];
sum2 = ;
continue;
}
sum1 += + len[end + ];
end++;
}
return ans;
}
};
原创,但不是最好的。有时间了再学习学习50行的。
Text Justification 实现两端对齐功能的更多相关文章
- [LeetCode] Text Justification 文本左右对齐
Given an array of words and a length L, format the text such that each line has exactly L characters ...
- Text Justification 文本左右对齐
Given an array of words and a length L, format the text such that each line has exactly L characters ...
- 实现css两端对齐
如何实现css的两端对齐功能? 最近做项目遇到这种情况,如图所示: input左边框的用户,旧密码,新密码,确认密码无法对齐,样式很丑. 解决办法: 找到对应的类名,加上:text-align:jus ...
- 68. Text Justification一行单词 两端对齐
[抄题]: Given an array of words and a width maxWidth, format the text such that each line has exactly ...
- [MIT6.006] 20. Daynamic Programming II: Text Justification, Blackjack 动态规划II:文本对齐,黑杰克
这节课通过讲解动态规划在文本对齐(Text Justification)和黑杰克(Blackjack)上的求解过程,来帮助我们理解动态规划的通用求解的五个步骤: 动态规划求解的五个"简单&q ...
- [Swift]LeetCode68. 文本左右对齐 | Text Justification
Given an array of words and a width maxWidth, format the text such that each line has exactly maxWid ...
- Text Justification,文本对齐
问题描述:把一个集合的单词按照每行L个字符放,每行要两端对齐,如果空格不能均匀分布在所有间隔中,那么左边的空格要多于右边的空格,最后一行靠左对齐. words: ["This", ...
- [Leetcode] text justification 文本对齐
Given an array of words and a length L, format the text such that each line has exactly L characters ...
- [LeetCode] 68. Text Justification 文本对齐
Given an array of words and a length L, format the text such that each line has exactly L characters ...
随机推荐
- BZOJ 3362 POJ 1984 Navigation Nightmare 并与正确集中检查
标题效果:一些养殖场是由一些南北或东西向的道路互连. 镶上在不断的过程中会问两个农场是什么曼哈顿的距离,假设现在是不是通信.那么输出-1. 思维:并与正确集中检查,f[i]点i至father[i]距离 ...
- ASP.NET开发规范:OWIN
ASP.NET开发规范:OWIN 今天投简历 准备面试了... 本节目录: OWIN简介 OWIN规范 Katana Hello World(3种Host) 自定义Middleware OWIN简介 ...
- Qt on Android: Qt 5.3.0 公布,针对 Android 改进的说明
5月20日本,Qt 官方博客宣布 Qt 5.3.0 公布! 这个版本号聚焦在性能.稳定性和可用性的提升上,与 5.1 / 5.2 相比有非常大提升. 5.3.0 的主要变化: 稳定能.可用性大大提升 ...
- Asp.Netserver控制发展Grid实现(一个)UI转让
使用Asp.Net办Web开发时间,控制系统提供了,目的,有时很难达到理想的.然后,有几种方法来解决,例如,使用html+js形式,在所需界面的布局的前端,然后通过ajax和其他方式获得的数据.为了实 ...
- Angular内置指令
记录一下工作中使用到的一些AngularJS内置指令 内置指令:所有的内置指令的前缀都为ng,不建议自定义指令使用该前缀,以免冲突 1. ng-model 使用ng-model实现双向绑定,通过表单的 ...
- CentOS 7 / RHEL 7 上安装 LAMP + phpMyAdmin
原文 CentOS 7 / RHEL 7 上安装 LAMP + phpMyAdmin 发表于 2014-11-02 作者 Haoxian Zeng 更新于 2014-12-12 之前根据在 Lin ...
- AngularJS html5Mode 使用 SVG Marker失效
接上一篇文章: 问题: 解决了html5Mode的路由问题之后,今天突然发现一个奇怪的问题:项目中使用SVG所画的箭头全都不见了?反复测试之后发现Chrome和Firefox有问题,而IE却可以显示, ...
- js之按键总结
js 实现键盘记录 兼容FireFox和IE 2009-01-07 11:43 作者:羽殇仁 转载请注明出处,谢谢. 本篇文章是我的第一百篇blog文章,恭喜一下! 这两天突然想弄弄js的键盘记录,所 ...
- Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds解
产生了一个解决这个问题的方法是在项目部署到tomcat比长45第二,当项目是比较大的,框架复杂的问题经常发生. 解决方法非常easy,找到以下这个路径中 workspace\.metadata\.pl ...
- ExecutorService 建立一个多线程的线程池的步骤
ExecutorService 建立一个多线程的线程池的步骤: 线程池的作用: 线程池功能是限制在系统中运行的线程数. 依据系统的环境情况,能够自己主动或手动设置线程数量.达到执行的最佳效果:少了浪费 ...