一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
假期后遗症带来的影响就是一整天都过得很慢
写字符串需要的行数
该题出自力扣的806题 —— 写字符串需要的行数【简单题】
审题
- 所谓题目越长,做法越简单。不要被超长的题目所迷惑
- 总的来说题意就是给出一个参考的数组,数组长度是26位,数组内的每一位都代表着小写字母所需要的的值(例如:widths[0] = 10,就代表着a所需要的为10)
- 每一行拥有100个单位。若填写的字母超过最后所剩的值,需要新加一行,放在新的一行里面
- 最终返回数组,数组内存放两个值,一个是所需要的的行数,一个是最后一行填了多少个单位
- 该题也可以直接暴力循环过去,从左到右遍历字符串 s 中的每个字母
- 直接把String s 转换成char数组
- 因为题目规定s的长度 >=1,所以行数变量的初始值为1
- 循环char数组
- 根据小写字母的ASIC值确定在枚举数组内的位置,并且拿到值
- 使用变量
a代指当前有多少行是满的,使用变量b代指当前填充光标所在的位置。 - 判断当前值是否大于当前行数的所剩空间
- 维护两个临时变量,一个是当前行数所剩单位,一个是当前行数填了多少
- 时间复杂度为O(n),因为进行了一次循环
- 空间复杂度为O(n),因为做了一次toCharArray()方法。如果每次都调用s.charAt(i)方法的话,空间复杂度可以为O(1)
编码
class Solution {
public int[] numberOfLines(int[] widths, String s) {
int Max = 1;
int last= 0;
int index = 100;
char[] c = s.toCharArray();
for (char q:c){
int a = widths[q-'a'];
if (index -a >=0){
index = index -a;
last += a;
}else {
Max++;
last = a;
index = 100-a;
}
}
int[] a = new int[2];
a[0] = Max;
a[1] = last;
return a;
}
}