先贴上自己的写法:
public String licenseKeyFormatting(String s, int k) {
String noDash = s.replace("-", "").toUpperCase();
int length = noDash.length();
if (length == 0)
{
return "";
}
int firstArrayL = length % k;
int loopNum = length / k;
if (firstArrayL == 0)
{
loopNum--;
firstArrayL = k;
}
StringBuilder strb = new StringBuilder();
strb.append(noDash.subSequence(0, firstArrayL));
for (int i = 0; i < loopNum; i++)
{
strb.append('-');
strb.append(noDash.subSequence(firstArrayL+k*i, firstArrayL+k*(i+1)));
}
return strb.toString();
}
思路中规中矩,按照需求,先去掉‘-’,再转换成大写。最后根据去掉‘-’后的长度算出第一个组的元素数。最后循环取数据。 最开始没判断全为'-'的情况,提交失败。 这段代码效率有点低,猜测耗时是在两个java string的方法。
查看解题思路后,看到一个挺好的思路:
public String licenseKeyFormatting(String s, int k) {
int length = s.length();
int num = 0;
StringBuilder strb = new StringBuilder();
for (int i = length - 1; i >= 0; i--)
{
char c = s.charAt(i);
if (c != '-')
{
if (num == k)
{
strb.append('-');
num = 0;
}
strb.append((char)((c >= 'a' && c <= 'z') ? (c+'A'-'a') : c));
num++;
}
}
return strb.reverse().toString();
}
这个思路就是,在循环中去做需求。避免循环耗时。 另外使用一个变量记录分组情况,达到一组后就进行下一组的数据存入。
算法的省时就是减少循环操作。