思路: 这道题我觉得主要还是考察大家细不细心。对于eage case的处理,或者是本题对于空格数量的处理。思路并不难,只是代码写起来比较麻烦,也有可能是我的选用的数据结构不高效,但是大家解题思路基本都是一样的。先找到每行的单词,然后分配空格。这边分配空格无非两种情况,一种是多余空间正好整除空隙数;第二种就是不能整除,像这种情况的话,我们就从左到右遍历这一行的单词,每碰到一个单词,就在单词后面加一个空格字符,于与此同时,多余空间也要-1。就这样不停循环遍历这一行,直到多余空间为0。还有一种比较特殊的情况,就是这一行只有一个单词,那么我们就左对齐。还有如果到了最后一行,那么也是左对齐。除了上面这两个情况,其他的都是两端对齐。两端对齐就采用我上面说的无非两种情况去解决就好了。下面展示代码:
class Solution {
public List<String> fullJustify(String[] words, int maxWidth) {
List<String> list = new ArrayList<>();
int pre = 0;
for(int i = 0; i < words.length; i++){
StringBuilder sb = new StringBuilder();
int len = -1;
for(int j = pre; j < i + 1; j++){
len += words[j].length() + 1 ;
}
if(len > maxWidth){
len -= words[i].length() + 1;
if(len == maxWidth){
for(int c = pre; c <= i - 1; c++){
sb.append(words[c]);
sb.append(" ");
}
list.add(sb.toString().trim());
}else{
int rem = maxWidth - len;
String space = "";
if(i - pre - 1 == 0){
sb.append(words[i-1]);
while(sb.length() < maxWidth){sb.append(" ");}
list.add(sb.toString());
}else{
if(rem % (i - pre - 1) == 0){
int numSpace = rem / (i- pre -1);
for(int m = 0; m < numSpace + 1; m++){
space += " ";
}
for(int n = pre; n <= i - 1; n++){
sb.append(words[n]);
sb.append(space);
}
list.add(sb.toString().trim());
}else{
String[] copy=(String[])words.clone();
for(int k = 0; k < words.length - 1; k++){
words[k] += " ";
}
while(rem > 0){
for(int a = pre; a <= i - 2; a++){
words[a] += " ";
rem--;
if(rem == 0){break;}
}
}
for(int b = pre; b <= i - 1; b++){sb.append(words[b]);}
list.add(sb.toString().trim());
words = (String[])copy.clone();
}
}
}
pre = i;
i--;
}else{
if( i == words.length - 1){
for(int p = pre; p <= i - 1; p++){
sb.append(words[p]);
sb.append(" ");
}
sb.append(words[i]);
while(sb.length() < maxWidth){sb.append(" ");}
list.add(sb.toString());
}
continue;
}
}
return list;
}
}
总结:
- 数组拷贝:s.clone(); 但返回类型是object,需要强制转换为该数组的类型。 e.g.,(String[])s.clone()