LeetCode 806题 写字符串需要的行数 -- JavaScript

本文介绍了一种算法,用于计算给定字符串在特定宽度限制下的排版所需行数及最后一行的宽度,通过遍历字符串并累计字符宽度来确定换行时机。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

我们要把给定的字符串 S 从左到右写到每一行上,每一行的最大宽度为100个单位,如果我们在写某个字母的时候会使这行超过了100 个单位,那么我们应该把这个字母写到下一行。我们给定了一个数组 widths ,这个数组 widths[0] 代表 'a' 需要的单位, widths[1] 代表 'b' 需要的单位,..., widths[25] 代表 'z' 需要的单位。

现在回答两个问题:至少多少行能放下 S,以及最后一行使用的宽度是多少个单位?将你的答案作为长度为2的整数列表返回。

示例 : 

输入: 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"
输出: [3, 60]
解释: 所有的字符拥有相同的占用单位10。所以书写所有的26个字母,我们需要2个整行和占用60个单位的一行。
输入: 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"
输出: [2, 4]
解释: 除去字母'a'所有的字符都是相同的单位10,并且字符串 "bbbcccdddaa" 将会覆盖 9 * 10 + 2 * 4 = 98 个单位.最后一个字母 'a' 将会被写到第二行,因为第一行只剩下2个单位了。所以,这个答案是2行,第二行有4个单位宽度。

注意:

  • 字符串 S 的长度在 [1, 1000] 的范围。
  • S 只包含小写字母。
  • widths 是长度为 26 的数组。
  • widths[i] 值的范围在 [2, 10]

方法分析:

该题算法很简单,最主要的就是要把题意弄懂。一定要多读几遍题目描述哦!我们通过遍历S,可以容易得到每个字母所占用的单位,然后依次累加,当其总占用单位大于100时,就该换行了,逻辑就这么简单直接。

代码实现:

var numberOfLines = function(widths, S) {
  let [row, rowWidth] = [1, 0];
  for(let i = 0;i < S.length;i++){
    let strWidth = widths[S[i].charCodeAt() - 97];
    rowWidth += strWidth;
    if(rowWidth > 100){
      row++;
      rowWidth = strWidth;
    }
  }
  return [row, rowWidth];
};

代码解析:

该代码中最精髓的应该是第4行,别急,慢慢分解。在函数内,首先初始化了写字符串需要的行数row为1和该行目前的宽度rowWidth为0。然后遍历 S,关键的来了,获取每个字符的宽度;S[i].charCodeAt() 返回的是该字符的ASCLL码,S[i].charCodeAt() - 97 得到的则是该字符相对于小写字母"a"(其ASCLL码为97)的偏移量。又由于widths数组中是依次存放的a,b,c,...,x,y,z的宽度,且 S 只包含小写字母,故可用该字符相对于a的编码偏移对应于该字符在widths数组中的索引位置。后面的代码就很简单了,对rowWidth进行累加,如果大于100,就换行,且更新rowWidth值。

参考链接:https://leetcode-cn.com/problems/number-of-lines-to-write-string/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值