LeetCode算法题-License Key Formatting(Java实现)
这是悦乐书的第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实现)的更多相关文章
- LeetCode算法题-Design HashMap(Java实现)
这是悦乐书的第299次更新,第318篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第167题(顺位题号是706).在不使用任何内置哈希表库的情况下设计HashMap.具体 ...
- LeetCode算法题-Design HashSet(Java实现)
这是悦乐书的第298次更新,第317篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第166题(顺位题号是705).不使用任何内建的hash表库设计一个hash集合,应包含 ...
- LeetCode算法题-Employee Importance(Java实现)
这是悦乐书的第291次更新,第309篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第159题(顺位题号是690).定义员工信息的数据结构,其中包括员工的唯一ID,他的重要 ...
- LeetCode算法题-Set Mismatch(Java实现)
这是悦乐书的第279次更新,第295篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第147题(顺位题号是645).集合S最初包含从1到n的数字. 但不幸的是,由于数据错误 ...
- LeetCode算法题-Distribute Candies(Java实现)
这是悦乐书的第266次更新,第279篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第133题(顺位题号是575).给定具有偶数长度的整数数组,其中该数组中的不同数字表示不 ...
- LeetCode算法题-Relative Ranks(Java实现)
这是悦乐书的第248次更新,第261篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第115题(顺位题号是506).根据N名运动员的得分,找到他们的相对等级和得分最高的三个 ...
- LeetCode算法题-Keyboard Row(Java实现)
这是悦乐书的第245次更新,第258篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第112题(顺位题号是500).给定一个单词列表,返回可以在美国键盘的一行上使用字母表键 ...
- LeetCode算法题-Ransom Note(Java实现)
这是悦乐书的第212次更新,第225篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第80题(顺位题号是383).给定一个任意赎金票据字符串和另一个包含所有杂志字母的字符串 ...
- LeetCode算法题-Word Pattern(Java实现)
这是悦乐书的第202次更新,第212篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第68题(顺位题号是290).给定一个模式和一个字符串str,找到str是否完全匹配该模 ...
随机推荐
- 深入理解OkHttp源码(三)——网络操作
这篇博客侧重于了解OkHttp的网络部分,包括Socket的创建.连接,连接池等要点.OkHttp对Socket的流操作使用了Okio进行了封装,本篇博客不做介绍,想了解的朋友可以参考拆轮子系列:拆O ...
- 【朝花夕拾】Android性能篇之(五)Android虚拟机
前言 Android虚拟机的使用,使得android应用和Linux内核分离,这样做使得android系统更稳定可靠,比如程序中即使包含恶意代码,也不会直接影响系统文件:也提高了跨平台兼容性.在And ...
- WebSocket刨根问底(二)
上篇文章[WebSocket刨根问底(一)]中我们对WebSocket的一些基本理论进行了介绍,但是并没有过多的涉及到一些实战的内容,今天我希望能够用几个简单的案例来向小伙伴们展示下WebSocket ...
- [软件开发技巧]·树莓派极简安装OpenCv
树莓派极简安装OpenCv 个人主页–> https://xiaosongshine.github.io/ 因为最近在开发使用树莓派+usb摄像头识别模块,打算用OpenCv,发现网上的树莓派O ...
- 深入解读阿里云数据库POLARDB核心功能物理复制技术
日志是数据库的重要组成部份,按顺序以增量的方式记录了数据库上所有的操作,日志模块的设计对于数据库的可靠性.稳定性和性能都非常重要. 可靠性方面,在有一个数据文件的基础全量备份后,对运行中的数据库来说, ...
- 如何打通CMDB,实现就近访问
CMDB在企业中,一般用于存放与机器设备.应用.服务等相关的元数据.当企业的机器及应用达到一定规模后就需要这样一个系统来存储和管理它们的元数据.有一些广泛使用的属性,例如机器的IP.主机名.机房.应用 ...
- [七]JavaIO之 PipedInputStream 和 PipedInputStream
管道简介
- [二十二]JavaIO之LineNumberReader
功能介绍 LineNumberReader是提供了行号的具体的装饰器类 跟踪行号的缓冲字符输入流 此类定义了方法 setLineNumber(int) 和 getLineNumber(),它们可分别用 ...
- Shiro+easyUI+SpringMVC实现登录认证
最近在做一个小项目,其中认证这块使用shiro+SpringMVC+easyUI,因为easyUI在提交数据的时候使用的是ajax的异步提交,所以shiro在处理数据的时候需要重写FormAuth ...
- .Net语言 APP开发平台——Smobiler学习日志:在手机应用中开发蛛网表格
最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 样式一 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的”Sm ...