这是悦乐书的第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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

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

最新文章

  1. python操作memcached以及分布式
  2. Debian普通用户添加sudo权限
  3. Angularjs相关理论
  4. 按照 where id in ()排序
  5. sc7731 Android 5.1 LCD驱动简明笔记之三
  6. 如何使用iframe实现隐藏的CSRF
  7. Java 抽象类与接口总结
  8. EffectiveC#18--用IComparable和IComparer实现对象的顺序关系
  9. HTML5学习笔记四:html5结构
  10. 【Java 并发】详解 ThreadLocal
  11. postman接口测试工具完整教程
  12. NW.js 简介与使用
  13. JQuery :contains选择器,可做搜索功能,搜索包含关键字的dom
  14. bzoj4830 hnoi2017 抛硬币
  15. Hbuilder开发app时生成ios要的mobileprovision和p12文件步骤.
  16. [JLOI 2016]成绩比较
  17. windows 64位环境下php执行环境部署配置
  18. VIM选择文本块/复制/粘贴
  19. vuex - 辅助函数学习
  20. 如何查看当前项目Laya的引擎版本

热门文章

  1. Linux下python2和python3共存
  2. ios 自动化构建 code-select: error: tool &#39;xcodebuild&#39; requires Xcode, but active developer directory.....
  3. 8分钟学会使用AutoMapper
  4. C# 《编写高质量代码改善建议》整理&amp;笔记 --(一)基本语言篇
  5. C#版 - Leetcode 306. 累加数 - 题解
  6. SpringBoot入门教程(一)详解intellij idea搭建SpringBoot
  7. Spring Cloud学习笔记-011
  8. REST API设计指导——译自Microsoft REST API Guidelines(一)
  9. 【.NET Core项目实战-统一认证平台】第十三章 授权篇-如何强制有效令牌过期
  10. DAL分页