算法小知识-----04.12-----写字符串需要的行数

80 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情

假期后遗症带来的影响就是一整天都过得很慢

写字符串需要的行数

该题出自力扣的806题 —— 写字符串需要的行数【简单题】

审题

image.png

  • 所谓题目越长,做法越简单。不要被超长的题目所迷惑
    • 总的来说题意就是给出一个参考的数组,数组长度是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;
    }
}

image.png