[LeetCode] Sentence Screen Fitting 调整屏幕上的句子
Given a rows x cols screen and a sentence represented by a list of words, find how many times the given sentence can be fitted on the screen.
Note:
- A word cannot be split into two lines.
- The order of words in the sentence must remain unchanged.
- Two consecutive words in a line must be separated by a single space.
- Total words in the sentence won't exceed 100.
- Length of each word won't exceed 10.
- 1 ≤ rows, cols ≤ 20,000.
Example 1:
Input:
rows = 2, cols = 8, sentence = ["hello", "world"] Output:
1 Explanation:
hello---
world--- The character '-' signifies an empty space on the screen.
Example 2:
Input:
rows = 3, cols = 6, sentence = ["a", "bcd", "e"] Output:
2 Explanation:
a-bcd-
e-a---
bcd-e- The character '-' signifies an empty space on the screen.
Example 3:
Input:
rows = 4, cols = 5, sentence = ["I", "had", "apple", "pie"] Output:
1 Explanation:
I-had
apple
pie-I
had-- The character '-' signifies an empty space on the screen.
这道题给我们了一个句子,由若干个单词组成,然后给我们了一个空白屏幕区域,让我们填充单词,前提是单词和单词之间需要一个空格隔开,而且单词不能断开,如果当前行剩余位置放不下某个单词,则必须将该单词整个移动到下一行。我刚开始想的是便利句子,每个单词分别处理,但是这种做法很不高效,因为有可能屏幕的宽度特别大,而单词可能就一两个,那么我们这样遍历的话就太浪费时间了,应该直接用宽度除以句子加上空格的长度之和,可以快速的得到能装下的个数。这是对于只有一行的可以直接这么做,难点在于剩下的空格不足以放下一个单词,就得另起一行。比如例子2中的第二行,a后面有三个空格,无法同时放下空格和bcd,所以bcd只能另起一行了。所以并不是每个位子都是可用的,我们需要记录有效空位的个数。还是拿例子2来举例,句子的总长度的求法时要在每个单词后面加上一个空格(包括最后一个单词),所以需要匹配的字符串是 a_bcd_e_,一共8个字符。每行有6个空位,我们用变量start来记录有效位的个数,先加上第一行的空位数,那么start即为6,我们先算start%len=6%8=6,然后all[6] = 'e',不是空格,不会进入if循环。为啥要判断这个呢,由于题目中说了如果某个单词刚好填满一行时,之后就不用加空格了,下一个单词可以从下一行的首位置开始,就像例子3中的第二行一样。那么什么时候会进入if从句呢,当 all[start%len]==' ' 的时候,此时start应该自增1,因为虽然剩余的位置刚好填满了单词,后面不用再加空格了,但是我们再算有效空位个数的时候还是要加上这个空格的。然后我们开始处理第二行,start再加上这行的长度,此时start为12,算start%len=12%8=4,然后all[4] = 'd',不是空格,不进入if从句。我们进入else从句,这里我们需要移除不合法的空位,此时我们需要算 (start-1)%len = 3,all[3] = 'c',不为空,所以start自减1,为11。然后再算(start-1)%len = 2,all[2] = 'b',不为空,所以start自减1,为10。然后再算(start-1)%len = 1,all[1] = ' ',为空,跳出循环。我们在第二行减去了2个不合法的空位,再来到第三行,start再加上这行的长度,此时start为16,算start%len=16%8=0,然后all[0] = 'a',不是空格,不进入if从句。我们进入else从句,这里我们需要移除不合法的空位,此时我们需要算 (start-1)%len = 7,all[7] = ' ',为空,跳出循环。最后用start/len=16/8=2,即为最终答案,参见代码如下:
解法一:
class Solution {
public:
int wordsTyping(vector<string>& sentence, int rows, int cols) {
string all = "";
for (string word : sentence) all += (word + " ");
int start = , len = all.size();
for (int i = ; i < rows; ++i) {
start += cols;
if (all[start % len] == ' ') {
++start;
} else {
while (start > && all[(start - ) % len] != ' ') {
--start;
}
}
}
return start / len;
}
};
下面这种方法也是很棒,同样也需要统计加空格的句子总长度,然后遍历每一行,初始化colsRemaining为cols,然后还需要一个变量idx,来记录当前单词的位置,如果colsRemaining大于0,就进行while循环,如果当前单词的长度小于等于colsRemaining,说明可以放下该单词,那么就减去该单词的长度就是剩余的空间,然后如果此时colsRemaining仍然大于0,则减去空格的长度1,然后idx自增1,如果idx此时超过单词个数的范围了,说明一整句可以放下,那么就有可能出现宽度远大于句子长度的情况,所以我们加上之前放好的一句之外,还要加上colsRemaining/len的个数,然后colsRemaining%len是剩余的位置,此时idx重置为0,参见代码如下:
解法二:
class Solution {
public:
int wordsTyping(vector<string>& sentence, int rows, int cols) {
string all = "";
for (string word : sentence) all += (word + " ");
int res = , idx = , n = sentence.size(), len = all.size();
for (int i = ; i < rows; ++i) {
int colsRemaining = cols;
while (colsRemaining > ) {
if (sentence[idx].size() <= colsRemaining) {
colsRemaining -= sentence[idx].size();
if (colsRemaining > ) colsRemaining -= ;
if (++idx >= n) {
res += ( + colsRemaining / len);
colsRemaining %= len;
idx = ;
}
} else {
break;
}
}
}
return res;
}
};
参考资料:
https://leetcode.com/problems/sentence-screen-fitting/
https://leetcode.com/problems/sentence-screen-fitting/discuss/90849/accepted-java-solution
https://leetcode.com/problems/sentence-screen-fitting/discuss/90845/21ms-18-lines-java-solution
LeetCode All in One 题目讲解汇总(持续更新中...)
[LeetCode] Sentence Screen Fitting 调整屏幕上的句子的更多相关文章
- Leetcode: Sentence Screen Fitting
Given a rows x cols screen and a sentence represented by a list of words, find how many times the gi ...
- 418. Sentence Screen Fitting
首先想到的是直接做,然后TLE. public class Solution { public int wordsTyping(String[] sentence, int rows, int col ...
- Sentence Screen Fitting
Given a rows x cols screen and a sentence represented by a list of words, find how many times the gi ...
- Droid@screen:在PC屏幕上显示Android手机屏幕
这里介绍一款工具——Droid@screen,用来获取手机屏幕,显示在PC屏幕上.它集截图.录像等多种功能于一体. 安装 1. 下载地址:http://droid-at-screen.org/d ...
- 在屏幕上搜索图片并返回图片所在位置的坐标的AutoHotkey脚本源代码(类似大漠插件)
;~ 在屏幕上搜索图片并返回图片所在位置的坐标的AutoHotkey脚本源代码(类似大漠插件) ; https://www.autohotkey.com/boards/viewtopic.php?t ...
- iOS开发之使用Storyboard预览UI在不同屏幕上的运行效果
在公司做项目一直使用Storyboard,虽然有时会遇到团队合作的Storyboard冲突问题,但是对于Storyboard开发效率之高还是比较划算的.在之前的博客中也提到过,团队合作使用Storyb ...
- Xenko基础API笔记3- Pointers指针设备屏幕上点对应的手指触摸。
样本这里是一个简单的示例程序,跟踪目前在屏幕上的指针和打印他们的位置.访问输入字段,类继承自@ SiliconStudio.Xenko.脚本的类. public override async Task ...
- ABAP modify screen:修改屏幕,实现隐藏、禁止输入字段
Loop at screen会loop处理屏幕上的每一个组件,并对其做相应的处理. SELECTION-SCREEN: BEGIN OF BLOCK B1 WITH FRAME.PARAMETERS ...
- 【opengl】OpenGL中三维物体显示在二维屏幕上显示的变换过程
转自:http://blog.sina.com.cn/s/blog_957b9fdb0100zesv.html 为了说明在三维物体到二维图象之间,需要经过什么样的变换,我们引入了相机(Camera)模 ...
随机推荐
- (原)用pixi.js 实现 方块阵点击后原地自转效果
源码 各位,请教一个问题,我这个还有BUG,我是想实现,点击一下可以 停止转动,然后再点一下重新转动.而不是一直加速,有没有什么好办法? PS:问题已经解决,谢谢评论的大神@Antineutrino ...
- spring整合mybatis使用<context:property-placeholder>时的坑
背景 最近项目要上线,需要开发一个数据迁移程序.程序的主要功能就是将一个数据库里的数据,查询出来经过一系列处理后导入另一个数据库.考虑到开发的方便快捷.自然想到用spring和mybatis整合一下. ...
- Java对象序列化剖析
对象序列化的目的 1)希望将Java对象持久化在文件中 2)将Java对象用于网络传输 实现方式 如果希望一个类的对象可以被序列化/反序列化,那该类必须实现java.io.Serializable接口 ...
- git 版本回退
由于操作失误,需要将代码进行版本回退,首先在本地仓库执行了“git reset --hard HEAD^”命令,这样只会回退本地仓库的代码,但是我的代码之前已经push到了远程库中,查看远程仓库,发现 ...
- Android 手机卫士8--删除通话记录
1.编写代码需要注意bug: 再删除通话记录的时候,删除的是以前的通话记录,本次拦截下来的电话号码,通话记录没有删除?????? 问题原因:数据库中本次通话记录的电话号码还没有插入,就做了删除操作 2 ...
- Oracle Sales Cloud:管理沙盒(定制化)小细节2——使用对象触发器更新数字字段
在上一篇 "管理沙盒(定制化)小细节1" 的随笔中,我们使用公式法在 "业务机会" 对象(单头)上建立了 "利润合计" 字段,并将它等于 & ...
- xcode8 storyboard 控件显示错位
升级xcode8 后选择device 为6s 出现上面的情况,控件显示异常.使用Update Frame 显示正常.不能选择Update Constraints 如果误选 commend + Z ...
- [Android]使用Dagger 2依赖注入 - 图表创建的性能(翻译)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5098943.html 使用Dagger 2依赖注入 - 图表创 ...
- EXD_BAD_ACCEEE
iOS开发过程中,普通的bug通常较容易定位问题所在,但是,EXD_BAD_ACCEEE问题却比较不易查找问题.本文记录下解决EXD_BAD_ACCEEE问题的过程.首先说一下 EXC_BAD_ACC ...
- SVN为什么比Git更好
首先我表明一个根本的立场,我个人更喜欢用Git,但是,这仅仅是一个个人偏好.当我们需要将一种技术方案带给整个团队的时候,并不是由我们的个人偏好作为主要决定因素,而应该充分去权衡利弊,选择对团队,对公司 ...