笔试题81. LeetCode OJ (68)

来源:互联网 发布:店铺怎么加入农村淘宝 编辑:程序博客网 时间:2024/06/06 03:05

        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不为0tmp += 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;elseoffset += 1; //num为0的特殊情况//统计完一行后需要将以下变量置0num = 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