这一题的思路想对了,就是middle justify的时候,当一行空格不均匀分配的处理没想清楚。
不知道这题考的点在哪里
class Solution {
public List<String> fullJustify(String[] words, int maxWidth) {
//res保存每一个string里的单词个数
List<Integer> res=new ArrayList<>();
List<String> ans=new ArrayList<>();
int j=0;
int sum=0;
int countline=0;
while(j<words.length){
//每次都先放一个单词进string里
sum+=words[j].length();
j++;
//countline计数
countline++;
while(j<words.length&&sum+words[j].length()+1<=maxWidth){
//这里的1是单词前的空格
sum+=words[j].length()+1;
countline++;
j++;
}
res.add(countline);
//sum和countline都还原0,准备下一个string
sum=0;
countline=0;
}
int k=0; //k表示每个string的第一个word的下标
for(Integer len: res){//len is the count words of a row
int count=0;//count是这一行所有的单词的字符数
for(int i=k;i<len+k;i++){
count+=words[i].length();
}
StringBuilder builder=new StringBuilder();
builder.append(words[k]);//先添加每一行的第一个单词
//如果是最后一行或者是该行只有一个单词,那么都是左对齐的
if (k+len == words.length || len-1 == 0) {
//先正常填一个空格,填一个字符串
for (int i = k+1; i < k+len; i++) {
builder.append(" ");
builder.append(words[i]);
}
//之后全部补上空格
for (int i = builder.length(); i < maxWidth; i++) {
builder.append(" ");
}
} else {
//不是最后一行:middle justified
//每个单词后面space的个数:(长度-累计单词总长度)/(单词个数-1)
// r为需要平均分配到中间的空格总数
int spaces=(maxWidth-count)/(len-1);// the space number should following each words
int r=(maxWidth-count)%(len-1); //多出来要平均分的
for (int i = k+1; i < k+len; i++) {
//先把应该分配的空格加上
for(int m=spaces; m > 0; m--) {
builder.append(" ");
}
//多余的从最左开始均匀分配!!!这里我没想到
if(r > 0) {
builder.append(" ");
r--;
}
builder.append(words[i]);
}
}
ans.add(builder.toString());
k=k+len;//k变成下一行的首单词的下标
}
return ans;
}
}
文本左右对齐算法解析
本文深入探讨了一种文本左右对齐的算法实现,重点讲解了如何在一行中均匀分配空格,特别是在处理多行文本时,如何在非最后一行进行居中对齐,以及在最后一行或单单词行进行左对齐的细节。通过具体代码示例,展示了算法的逻辑流程和关键步骤。
326

被折叠的 条评论
为什么被折叠?



