【leetcode刷题笔记】Text Justification
Given an array of words and a length L, format the text such that each line has exactly L characters and is fully (left and right) justified.
You should pack your words in a greedy approach; that is, pack as many words as you can in each line. Pad extra spaces ' ' when necessary so that each line has exactly L characters.
Extra spaces between words should be distributed as evenly as possible. If the number of spaces on a line do not divide evenly between words, the empty slots on the left will be assigned more spaces than the slots on the right.
For the last line of text, it should be left justified and no extra space is inserted between words.
For example,
words: ["This", "is", "an", "example", "of", "text", "justification."]
L: 16.
Return the formatted lines as:
[
"This is an",
"example of text",
"justification. "
]
Note: Each word is guaranteed not to exceed L in length.
题解:题目倒是不难,按照题目一步步走就是了,就是细节太多了,交了好多次T_T
从位置i开始往前取词,直到取到的词长度大于L停止取词,假设此时取到第j个词,用curLen统计这些词和它们之间的空格的长度,那么剩下来要额外平均分配到各个单词之间的空格数目就是totalSpaces = L-curLen,所以每个单词之间平均分配(L-curLen)/(j-i)个空格,但是有可能L-curLen不能被(j-i)除尽,那么余出来的空格又要一个一个插入到第一个单词间隙,第二个单词间隙......(注意不是全部插入到第一个单词间隙中)。对于最后一行,将totalSpaces直接设置为0,即不添加额外的空格,然后在结尾处填充空格使其长度达到L。
代码如下:
public class Solution {
private String genericSpaces(int num){
StringBuffer sb = new StringBuffer();
for(int i = 0;i < num;i++)
sb.append(" ");
return sb.toString();
}
public List<String> fullJustify(String[] words, int L) {
List<String> answer = new ArrayList<String>();
int curLen = 0;
for(int i = 0;i < words.length;){
curLen = 0;
int j = i;
for(;j<words.length && curLen+words[j].length()<=L;){
curLen = curLen + words[j].length() + 1;
j++;
}
curLen--;
int totalSpace = L-curLen;
j--;
int eachSpace = j==i?0:totalSpace/(j-i);
//handle last line, there are only one spaces bewteen words
if(j == words.length-1){
totalSpace = 0;
eachSpace = 0;
}
StringBuffer concate = new StringBuffer();
for(int k = i;k<=j;k++){
concate.append(words[k]);
if(k != j)
concate.append(" ");
String spaces;
//if totalSpace can't be evenly distributed
if(totalSpace-eachSpace*(j-i)!=0){
spaces = genericSpaces(eachSpace+1);
totalSpace--;
}
else {
spaces = genericSpaces(eachSpace);
}
//last word isn't followed by spaces
if(k != j)
concate.append(spaces);
}
//to handle the last line, adding extra spaces to reach length L
while(concate.length()<L)
concate.append(" ");
answer.add(concate.toString());
i=j+1;
}
return answer;
}
}
【leetcode刷题笔记】Text Justification的更多相关文章
- LeetCode刷题笔记和想法(C++)
主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...
- 18.9.10 LeetCode刷题笔记
本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...
- LeetCode刷题笔记 - 12. 整数转罗马数字
学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...
- Leetcode刷题笔记(双指针)
1.何为双指针 双指针主要用来遍历数组,两个指针指向不同的元素,从而协同完成任务.我们也可以类比这个概念,推广到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,可以称之为滑动窗口 ...
- LeetCode刷题笔记(1-9)
LeetCode1-9 本文更多是作为一个习题笔记,没有太多讲解 1.两数之和 题目请点击链接 ↑ 最先想到暴力解法,直接双循环,但是这样复杂度为n平方 public int[] twoSum(int ...
- leetcode刷题笔记
(1)Best Time to Buy and Sell Stock Total Accepted: 10430 Total Submissions: 33800My Submissions Say ...
- leetcode刷题笔记08 字符串转整数 (atoi)
题目描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即 ...
- LeetCode刷题笔记-回溯法-分割回文串
题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab"输出:[ ["aa", ...
- leetcode刷题笔记231 2的幂
题目描述: 给定一个整数,写一个函数来判断它是否是2的幂. 题目分析: 判断一个整数是不是2的幂,可根据二进制来分析.2的幂如2,4,8,等有一个特点: 二进制数首位为1,其他位为0,如2为10,4为 ...
随机推荐
- error: not found: value sc
[问题] 解压spark的tar包后,执行bin/spark-shell,执行val lines=sc.textFile("README.md")时,抛错error: not fo ...
- github桌面工具commit不了解决
这样发现github上还是空文件, 因为要重新添加过 1. git add -A 添加所有文件 2. git commit -m "xxx" 3. git push -u ...
- makefile编写---单个子目录编译模板
经过这次地库项目之后,虽然时间不久,跟团队在一起,虽然队员不一定在技术上有过人之处,但是来自大公司的员工,在工具使用和代码规范方面还是有点可鉴之处,在搭建主控模块是,就得面临makefile编写,因为 ...
- MySQL的下载及安装
前言:不仅要知其然,还要知所以然 MySQL数据库作为关系型数据库中的佼佼者,因其体积小,速度快,成本低,不仅受到了市场的极大追捧,也受到了广大程序员的青睐.接下来,就给大家说一下,MySQL的下载和 ...
- OKhttp3
针对上一博文订单调用用户使用默认数据交互方式,下面介绍下使用 Okhttp3网络数据交换方式. 1.订单启动类变化 package com.tycoon.orderService; import or ...
- Android无线测试之—UiAutomator UiDevice API介绍三
获取坐标与坐标点击 一.坐标相关的知识: 1)手机屏幕坐标:左上角开始到右下角结束 2)DP:设备独立像素,例如320像素显示到640像素上要拉伸一倍 3)Point:代表一个点(x,y),左上角的坐 ...
- Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.3——用Eclipse ADT导出App
问题: 想在一个已经存在的Eclipse ADT的项目中使用Gradle 解决方案: Eclipse ADT插件可以帮助生成Gradle文件 讨论: Eclipse的ADT插件是在2013年推出Gra ...
- tomcat访问日志分析
常使用web服务器的朋友大都了解,一般的web server有两部分日志: 一是运行中的日志,它主要记录运行的一些信息,尤其是一些异常错误日志信息 二是访问日志信息,它记录的访问的时间,IP,访问的资 ...
- 对EasyDarwin开源项目2018的思考与2019发展的规划:继续站在巨人的肩膀引入更多巨人
EasyDarwin@2018思考 从2012年开始接触Darwin Streaming Server,到2018年从底层开始完全重新架构.研发.完成,EasyDarwin这个项目已经发展了6年了,时 ...
- FlaskWeb开发
Flask基本使用 上下文 程序上下文 current_app g 请求上下文 request session https://blog.csdn.net/wsxqaz/article/details ...