Java&C++题解与拓展——leetcode806.写字符串需要的行数【么的新知识】

136 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

每日一题做题记录,参考官方和三叶的题解

题目要求

image.png

思路:模拟

简单题……就模拟呗……

定义rowrow为当前所在的行,定义curcur表示当前行字符串末端位置。
用Unicode取每个字符的宽度ww,然后——

  • w+cur<=100w+cur <= 100,则该字符可以放在当前行;
  • w+cur>100w+cur > 100,该字符越界,需要放到下一行,rowrow自增,curcur重新计数为当前字符长度。

Java

class Solution {
    public int[] numberOfLines(int[] widths, String s) {
        int row = 0, cur = 0;
        for(char c : s.toCharArray()) {
            int w = widths[c - 'a'];
            if(cur + w > 100 && ++row >= 0)
                cur = w;
            else
                cur += w;
        }
        if(cur != 0)
            row++;
        return new int[]{row, cur};
    }
}
  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(n)O(n),因为用了toCharArray

Java+1

给空间复杂度降到O(1)O(1),也就是把toCharArray换成charAt

class Solution {
    public int[] numberOfLines(int[] widths, String s) {
        int row = 0, cur = 0;
        for(int i = 0; i < s.length(); i++) {
            int w = widths[s.charAt(i) - 'a'];
            if(cur + w > 100 && ++row >= 0)
                cur = w;
            else
                cur += w;
        }
        if(cur != 0)
            row++;
        return new int[]{row, cur};
    }
}
  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(1)O(1)

C++

class Solution {
public:
    vector<int> numberOfLines(vector<int>& widths, string s) {
        int row = 0, cur = 0;
        for(int i = 0; i < s.length(); i++) {
            int w = widths[s[i] - 'a'];
            if(cur + w > 100 && ++row >= 0)
                cur = w;
            else
                cur += w;
        }
        if(cur != 0)
            row++;
        return {row, cur};
    }
};
  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(1)O(1)

Python

python没有自增,所以不能偷懒搞恒等式来简化代码,乖乖加一吧。

class Solution:
    def numberOfLines(self, widths: List[int], s: str) -> List[int]:
        row, cur = 0, 0
        for c in s:
            w = widths[ord(c) - ord('a')]
            if cur + w > 100:
                cur = w
                row += 1
            else:
                cur += w
        if(cur != 0):
            row += 1
        return [row, cur]
  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(1)O(1)

函数ord()

  • 学习参考链接
  • 返回字符的ASCII数值或Unicode数值,仅可传入字符作为参数,返回值为十进制整数。

总结

……模拟就没啥好说的,顺着思路走就完了……实在没啥好分析的

【属于是嫌简单题简单嫌困难题麻烦】


欢迎指正与讨论!