题目
We are to write the letters of a given string S
, from left to right into lines. Each line has maximum width 100 units, and if writing a letter would cause the width of the line to exceed 100 units, it is written on the next line. We are given an array widths
, an array where widths[0] is the width of 'a', widths[1] is the width of 'b', ..., and widths[25] is the width of 'z'.
Now answer two questions: how many lines have at least one character from S
, and what is the width used by the last such line? Return your answer as an integer list of length 2.
Example :
Input:
widths = [10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
S = "abcdefghijklmnopqrstuvwxyz"
Output: [3, 60]
Explanation:
All letters have the same length of 10. To write all 26 letters,
we need two full lines and one line with 60 units.
Example :
Input:
widths = [4,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
S = "bbbcccdddaaa"
Output: [2, 4]
Explanation:
All letters except 'a' have the same length of 10, and
"bbbcccdddaa" will cover 9 * 10 + 2 * 4 = 98 units.
For the last 'a', it is written on the second line because
there is only 2 units left in the first line.
So the answer is 2 lines, plus 4 units in the second line.
Note:
- The length of
S
will be in the range [1, 1000]. -
S
will only contain lowercase letters. -
widths
is an array of length26
. -
widths[i]
will be in the range of[2, 10]
.
讲解
这道题有点写缓冲区的意思,很考验逻辑性。
- 如果缓冲区还没满,就塞一个试试
- 如果大于缓冲区的长度,就换一行,并让新的缓冲区重新接收;如果缓冲区恰好满了,也是换一行,缓冲区长度置0.
Java代码
class Solution {
public int[] numberOfLines(int[] widths, String S) {
if(S==null){
return new int[]{0, 0};
}
char[] c = S.toCharArray();
int count=1;
int len = 0;
for(int i=0;i<c.length;i++){
if(len<100){
len += widths[c[i]-'a'];
}
if(len>100){
len = widths[c[i]-'a'];
count++;
}else if(len==100){
len = 0;
count++;
}
}
return new int[]{count, len};
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。