LeetCode 68

        Text Justification

   这个题的意思比较简单,但是情况很复杂,输入一些列单词,然后将这些单词按照规定的长度组合,参照例子大概就可以知道组合的规律,首先分析一下,然后再给出解题思路。这个题的规律如下:

(1).每两个单词之间有一个空格,一行中若有些单词无法完全排列下来就将它放在新的一行中。

(2).最后一行和他之前的所有行有些不一样,最后一行是按照一个单词一个空格来排列的;而他之前的每行,若有两个单词,则这两个单词必须分别在最左和最右端。

我提供两个测试用例来帮助大家分析容易漏掉的地方:


除了上面两种情况以外,还有的情况就是: 

  [""]  2         ["  "]    (L的长度为2,但是提供的只是一个空串,但是返回的结果却要包含两个长度,即: ["  "])


解题思路:遍历单词数组,统计每个单词的长度(算上空格的占位),若是当前位置所在的区间的所有单词的长度大于题目给定的长度,那么就需要按照规律插入,就这样一直执行,最后需要判断最后一行的处理。

我的解题代码如下:

class Solution 
{
public:
	vector<string> fullJustify(vector<string>& words, int maxWidth) 
	{
		vector<string> ret;
		ret.clear();

		if (words.size() == 0 || maxWidth <= 0)
		{
			return words;
		}

		int begin = 0; //开始位置
		int end = words.size(); //结束为止
		int num = 0; //统计每个区间单词的个数(这个区间就是需要合并的单词的区间)
		int sz = 0; //统计纯单词的长度
		int bits = 0; //统计包括每个单词后面跟上空格后的数量
		int offset = 0; //偏移量
		
		while (begin < end)
		{
			int len = words[begin].size();
			
			if (len > maxWidth)
			{
				return vector<string>(1,"");
			}
			
			if (bits + len >maxWidth)
			{ //占位超过,需要添加
				string tmp = "";
				if (num == 1)
				{//单独一个的时候需要补齐
					int len = words[offset + num - 1].size();
					tmp = words[offset + num - 1];
					tmp += string(maxWidth - len, ' ');
				}
				else
				{					
					int every = (maxWidth - sz) / (num - 1);
					int left = maxWidth - sz - (num - 1)*every;
					int pos = 0;
					for (int i = 0; i < num-1; ++i)
					{
						tmp += words[offset + i];
						if (pos < left)
						{
							string tb(every + 1, ' ');
							tmp += tb;
						}
						else
						{
							string tb(every, ' ');
							tmp += tb;
						}
						++pos;
					}
					if (num > 0)
					{ //num不为0
						tmp += words[offset + num - 1];
					}
					else
					{ num为0的特殊情况
						int len = words[offset + num].size();
						tmp += words[offset + num];
						tmp += string(maxWidth - len, ' ');
					}
				}
				ret.push_back(tmp);
				
				if (num > 0) 
					offset += num;
				else
					offset += 1; //num为0的特殊情况
				
				//统计完一行后需要将以下变量置0
				num = 0; 
				sz = 0;
				bits = 0;
			}
			
			sz += len; //不算空格
			bits += len + 1; //算上空格
			++num;
			++begin;
		}
		
		//最后一行没有处理,最后一行的格式有别于之前的
		if (offset != end)
		{
			string tmp = "";
			if (num == 1)
			{
				int len = words[offset + num - 1].size();
				tmp = words[offset + num - 1];
				tmp += string(maxWidth - len, ' ');
			}
			else
			{
				int pos = 0;
				for (int i = 0; i < num - 1; ++i)
				{
					tmp += words[offset + i];
					tmp += ' ';
					++pos;
				}				
				tmp += words[offset + num - 1];
				tmp += string(maxWidth - bits + 1, ' '); //空格补齐
			}
			ret.push_back(tmp);
		}

		return ret;
	}
};
程序结果如下:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值