每日一题「写字符串需要的行数」
Posted 陈皮的JavaLib
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题「写字符串需要的行数」相关的知识,希望对你有一定的参考价值。
文章目录
题目
我们要把给定的字符串 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]
本次分享到此结束啦~~
我是陈皮,一个在互联网 Coding 的 ITer,如果觉得文章对你有帮助,点赞、收藏、关注、评论,您的支持就是我创作最大的动力!
以上是关于每日一题「写字符串需要的行数」的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 806. 写字符串需要的行数 / 380. O 时间插入删除和获取随机元素 / 1672. 最富有客户的资产总量
算法千题案例每日LeetCode打卡——96.写字符串需要的行数