每日一题「写字符串需要的行数」

举报
陈皮的JavaLib 发表于 2022/04/12 22:46:21 2022/04/12
【摘要】 写字符串需要的行数

我是陈皮,一个在互联网 Coding 的 ITer,个人微信公众号「陈皮的JavaLib」关注第一时间阅读最新技术文章。

题目

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

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

示例 1:

输入:

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个单位的一行。

示例 2:

输入:

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]。

来源:力扣(LeetCode)

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

思路与算法

直接遍历字符串每个字母,遍历过程中,同时记录当前需要的行数,以及当前行已经使用的宽度。

假设当前已经需要的行数为 totalLines,当前行已经使用的宽度为 usedLineWidth,当前遍历的字母为 x,那么:

  • 如果 usedLineWidth + widths[x - ‘a’] <= 100,那么行数 totalLines 不变,当前行占用宽度 usedLineWidth 加上当前字母占用的宽度。
  • 如果 usedLineWidth + widths[x - ‘a’] > 100,那么行数 totalLines 加1,当前字母需要放到下一行,新的行初始使用宽度为当前字母的宽度。

代码实现

package com.chenpi.no0806NumberOfLines;

import java.util.Arrays;

/**
 * @author 陈皮
 * @version 1.0
 * @description
 * @date 2022/4/12
 */
public class No0806NumberOfLines {

  public static void main(String[] args) {
    No0806NumberOfLines inst = new No0806NumberOfLines();
//    int[] 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};
//    String s = "abcdefghijklmnopqrstuvwxyz";

//    int[] 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};
//    String s = "bbbcccdddaaa";

    int[] widths = {7, 5, 4, 7, 10, 7, 9, 4, 8, 9, 6, 5, 4, 2, 3, 10, 9, 9, 3, 7, 5, 2, 9, 4, 8, 9};
    String s = "zlrovckbgjqofmdzqetflraziyvkvcxzahzuuveypqxmjbwrjvmpdxjuhqyktuwjvmbeswxuznumazgxvitdrzxmqzhaaudztgie";
    System.out.println(Arrays.toString(inst.numberOfLines(widths, s)));
  }

  public int[] numberOfLines(int[] widths, String s) {

    // 总共行数
    int totalLines = 1;

    // 当前行已经使用的宽度
    int usedLineWidth = 0;

    for (int i = 0; i < s.length(); i++) {
      // 当前字符占用的宽度
      int charWidth = widths[s.charAt(i) - 'a'];
      // 当前字符占用的宽度加到当前行已使用的宽度中
      usedLineWidth += charWidth;
      // 超过行宽度
      if (usedLineWidth > 100) {
        // 总行数加1
        totalLines++;
        // 当前单词占用宽度作为新一行的
        usedLineWidth = charWidth;
      }
    }
    return new int[]{totalLines, usedLineWidth};
  }
}

输出结果

[7, 69]


本次分享到此结束啦~~

如果觉得文章对你有帮助,点赞、收藏、关注、评论,您的支持就是我创作最大的动力!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。