给定一个单词数组和长度L,将该单词数组中文本两端对齐(左边和右边),使每一行都有L个字符。
你要在每一行中尽可能多地填充单词。在必要时填充额外的空格' ',使每行正好有L个字符。
单词之间的额外空格要尽可能均匀地分布。如果一行的空格数不能在单词之间平均分配,请在左边分配更多的空格
对于最后一行文本,它应该左对齐,并且单词之间不插入额外的空格。
例如,
单词数组为:["This", "is", "an", "example", "of", "text", "justification."]
L:16.
返回
[↵ "This is an",↵ "example of text",↵ "justification. "↵]
注意:
题目保证每个单词的长度不超过L。
特殊样例:
- 有一些行(不是最后一行)可能只包含一个单词。在这种情况下该怎么办? 在这种测试数据中,这一行应该左对齐。
- 注意:同一行的两个单词之间要有一行空格
<?php function fullJustify($arrWords, $l) { $num = count($arrWords); $need = $l; $start = 0; $end = -1; $arrRet = array(); for ($i = 0; $i < $num; $i ++) { $sLen = strlen($arrWords[$i]); //如果这个放不下,就代表这一行结束了。 if ($sLen > $need) { $gapNum = $i - 1 - $start; $flag = ($need + $gapNum + 1) % $gapNum;//需要填补的空格是否能被整除 $spaceNum = floor(($need + $gapNum + 1) / $gapNum); $str = ''; for ($j = $start; $j < $i - 1; $j ++) { $str .= $arrWords[$j]; for ($k = 0; $k < $spaceNum; $k ++) { $str .= ' '; } //不能被整除需要左边多加空格 if ($flag != 0) { $str .= ' '; $flag --; } } //一行的最后一个字符不需要空格 $arrRet[] = $str . $arrWords[$j];; $start = $i; $end = $i - 1; $need = $l - $sLen -1; } else { if ($need == $sLen) { $str = ''; for ($j = $start; $j < $i; $j ++) { $str .= $arrWords[$j] . ' '; } //一行的最后一个字符不需要空格 $arrRet[] = $str . $arrWords[$j]; $need = $l; $start = $i + 1; $end = $i; } else { $need = $need - $sLen - 1; } } } //最后一列 if ($end != $num - 1) { $str = ''; for ($i = $start; $i < $num - 1; $i ++) { $str .= $arrWords[$i] . ' '; } //最后一行的最后一个单词 $str .= $arrWords[$i]; $strLen = strlen($str); for ($i = 0; $i < $l - $strLen; $i ++) { $str .= ' '; } $arrRet[] = $str; } print json_encode($arrRet); } //'this','is','an','example','of','text', $arr = ['justification.']; fullJustify($arr, 16);
本文介绍了一种将单词数组在给定长度内两端对齐的算法,确保每行恰好有L个字符,通过均匀分布额外空格实现。最后一行左对齐,不插入额外空格。算法考虑了单词长度不超过L的约束。
1126

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



