这是悦乐书的第241次更新,第254篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第108题(顺位题号是482)。您将获得一个表示为字符串S的许可证密钥,该字符串仅包含字母数字字符和短划线。该字符串被N个破折号分成N + 1个组。

给定数字K,我们希望重新格式化字符串,使得每个组包含正好的K个字符,但第一个组可能比K短,但仍然必须包含至少一个字符。此外,必须在两个组之间插入短划线,并且所有小写字母都应转换为大写。给定非空字符串S和数字K,根据上述规则格式化字符串。例如:

输入:S =“5F3Z-2e-9-w”,K = 4

输出:“5F3Z-2E9W”

说明:字符串S分为两部分,每部分有4个字符。请注意,不需要两个额外的破折号,可以删除。



输入:S =“2-5g-3-J”,K = 2

输出:“2-5G-3J”

说明:字符串S被分成三个部分,每个部分除了第一部分之外有2个字符,因为它可以更短,如上所述。

注意:

  • 字符串S的长度不超过12,000,K是正整数。

  • 字符串S仅由字母数字字符(a-z和/或A-Z和/或0-9)和短划线( - )组成。

  • 字符串S非空。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

先将S中的"-"给替换掉,然后从后往前进行截取K个子串,并将其用“-”连接,如果最后一次截取的长度不够K,就直接从0开始截取,最后将新的字符串转为大写字母并返回。

public String licenseKeyFormatting(String S, int K) {
StringBuilder sb = new StringBuilder();
String ss = S.replace("-", "");
for (int i=ss.length(); i>0; i-= K) {
if (i-K > 0) {
sb.insert(0, "-"+ss.substring(i-K, i));
} else {
sb.insert(0, ss.substring(0, i));
}
}
return sb.toString().toUpperCase();
}

03 第二种解法

将S变为字符数组,然后从后往前遍历,使用一个变量记数,来判断是否使用“-”连接两端,使用完“-”后,count要重归于1,以便下次继续使用。

public String licenseKeyFormatting2(String S, int K) {
StringBuilder sb = new StringBuilder();
char[] arr = S.toCharArray();
int count = 0, len = S.length()-1;
for (int i=len; i>=0; i--) {
if (arr[i] != '-') {
if (count < K) {
sb.append(arr[i]+"");
count++;
} else {
sb.append("-");
sb.append(arr[i]+"");
count = 1;
}
}
}
return sb.reverse().toString().toUpperCase();
}

04 第三种解法

和第二种思路一样,在判断什么时候使用"-"时,用了一点取巧,

sb.length() % (K + 1)

使用新字符串的长度对K+1取余,如果等于K,就说明新字符串到了该拼接"-"的位置了。

public String licenseKeyFormatting3(String S, int K) {
StringBuilder sb = new StringBuilder();
for (int i = S.length() - 1; i >= 0; i--) {
if (S.charAt(i) != '-'){
sb.append(sb.length() % (K + 1) == K ? '-' : "").append(S.charAt(i));
}
}
return sb.reverse().toString().toUpperCase();
}

05 小结

算法专题目前已日更超过三个月,算法题文章108+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-License Key Formatting(Java实现)的更多相关文章

  1. LeetCode算法题-Design HashMap(Java实现)

    这是悦乐书的第299次更新,第318篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第167题(顺位题号是706).在不使用任何内置哈希表库的情况下设计HashMap.具体 ...

  2. LeetCode算法题-Design HashSet(Java实现)

    这是悦乐书的第298次更新,第317篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第166题(顺位题号是705).不使用任何内建的hash表库设计一个hash集合,应包含 ...

  3. LeetCode算法题-Employee Importance(Java实现)

    这是悦乐书的第291次更新,第309篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第159题(顺位题号是690).定义员工信息的数据结构,其中包括员工的唯一ID,他的重要 ...

  4. LeetCode算法题-Set Mismatch(Java实现)

    这是悦乐书的第279次更新,第295篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第147题(顺位题号是645).集合S最初包含从1到n的数字. 但不幸的是,由于数据错误 ...

  5. LeetCode算法题-Distribute Candies(Java实现)

    这是悦乐书的第266次更新,第279篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第133题(顺位题号是575).给定具有偶数长度的整数数组,其中该数组中的不同数字表示不 ...

  6. LeetCode算法题-Relative Ranks(Java实现)

    这是悦乐书的第248次更新,第261篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第115题(顺位题号是506).根据N名运动员的得分,找到他们的相对等级和得分最高的三个 ...

  7. LeetCode算法题-Keyboard Row(Java实现)

    这是悦乐书的第245次更新,第258篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第112题(顺位题号是500).给定一个单词列表,返回可以在美国键盘的一行上使用字母表键 ...

  8. LeetCode算法题-Ransom Note(Java实现)

    这是悦乐书的第212次更新,第225篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第80题(顺位题号是383).给定一个任意赎金票据字符串和另一个包含所有杂志字母的字符串 ...

  9. LeetCode算法题-Word Pattern(Java实现)

    这是悦乐书的第202次更新,第212篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第68题(顺位题号是290).给定一个模式和一个字符串str,找到str是否完全匹配该模 ...

随机推荐

  1. Lucene 07 - 对Lucene的索引库进行增删改查

    目录 1 添加索引 2 删除索引 2.1 根据Term删除索引 2.2 删除全部索引(慎用) 3 更新索引 数据保存在关系型数据库中, 需要实现增.删.改.查操作; 索引保存在索引库中, 也需要实现增 ...

  2. Java基础11:Java泛型详解

    本文对java的泛型的概念和使用做了详尽的介绍. 本文参考https://blog.csdn.net/s10461/article/details/53941091 具体代码在我的GitHub中可以找 ...

  3. Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(四):发布与回滚

    写在前面 我们以前windows跑.net Framework程序的时候,发布,自己乖乖的替换程序:备份,也是自己一个一个的重命名备份:回滚,发布遇到问题的回滚更是不用说了:运维很是怕我们 这些用wi ...

  4. 冗余jar包识别神器 - loose.jar

    冗余jar包识别神器 - loose.jar 场景描述 项目迭代久了,会添加各类jar包,事实上很多jar包其实根本没用到.那如何快速识别冗余的jar,以方便从项目中清除掉呢? 比如: 该简单的测试工 ...

  5. vm12 安装ubuntu15.10详细图文教程 虚拟机安装ubuntu安装 ubuntu更新软件 ubuntu一直卡在下载语言怎么办?

    1,准备工作-ubuntu下载 ubuntu官网下载 如何官网下载ubuntu http://www.ubuntu.com/download/ 2,打开虚拟机 虚拟机安装ubuntu15.10 虚拟机 ...

  6. [java]final关键字的几种用法

    在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们来了解一下final ...

  7. 【转载】C#中自定义Sort的排序规则IComparable接口

    C#中的List集合在排序的时候,如果不使用Lambda表达式进行排序的话,一般调用Sort()方法进行排序,如果希望Sort()方法排序后的结果跟我们预想的效果一致或者按照我们自定义的规则排序,则需 ...

  8. Linux学习笔记之Python3的安装以及创建虚拟环境(CentOS)

    安装python3 一.安装需要编译的关联库 yum instal -y zlib zlib-devel (根据自己系统的情况,安装需要的关联库,同样用yum安装即可) yum install ope ...

  9. Kotlin for循环使用

    普通for循环 for(i in 1..4){ println(i) } 结果为1234 循环四次 反序for循环 for(i in 4 downTo 1){ println(i) } 结果为4321 ...

  10. MySql 双主多从配置指导

    MySql 双主多从配置指导 一.背景 互联网项目为了数据的可靠性和架构的可拓展性经常会用到双主多从的数据库,来实现数据的备份.负载均衡和突发状况时数据库切换. 二.思路 配置两台数据库A.B互为主从 ...