面试考了两题,都是比较简单的题,但是由于脱离了百度直接敲代码比较生疏(/滑稽),在有限的时间内还是没有写好,后面完善了一下,顺便记录一下(另外两道sql题比较简单就不放上来了)
题目:
压缩字符串:输入随意不为空的由(a-z)小写字母组成的字符串,将其压缩输出,压缩规则为计算连续相同的字符拼成一个新的字符串
示例1:“aaa” >>“3a”
示例2:“a” >>“a”
示例3:“aaabccaeee” >>“3ab2ca3e”
解题过程
1.其实这题之前有看过,好像是有很牛逼的解法的,但是我一时只能想到for循环暴力破解,因为是限时的就直接写了,也是因为这样逻辑细节比较难写清楚,最后时间到了也没有处理好最后一位,面试结束后将其完善,代码如下:
public static void stringZip(String str) {
int length = str.length();
StringBuilder stringBuilder = new StringBuilder();
int count = 0;
char temp = ' ';
if (length == 1){
System.out.println(str);
return;
}
for (int i = 0;i<length;++i){
temp = str.charAt(i);
++count;
if (i+1 < length){
if (str.charAt(i+1) == temp){
if (i + 2 == length){
if (count + 1 > 1){
stringBuilder.append(count+1);
}
stringBuilder.append(temp);
}
}else if (i + 2 == length) {
if (count > 1){
stringBuilder.append(count);
}
stringBuilder.append(temp);
stringBuilder.append(str.charAt(length - 1));
}else {
if (count > 1){
stringBuilder.append(count);
}
stringBuilder.append(temp);
count = 0;
}
}
}
System.out.println(stringBuilder.toString());
}
2.写的确实烂,但是应该是可以做出来的,后面考虑了一下之前为了处理最后一位太麻烦了,我干脆在最后加个“0”这样就不需要考虑最后一位的问题了
3.在第二步的基础上又思索了一下,跟下一位对比得考虑越界问题,每次循环都要判断,这一步应该也可以优化,我也可以直接从第二位开始跟前面做比较(因为自己加了个0在后面,不为空的字符串至少也有两位了),最后的代码如下
public static void stringZip2(String s){
StringBuilder stringBuilder = new StringBuilder();
if (s.length() == 1){
System.out.println(s);
return;
}
s = s +"0";
int count=1;
for (int i = 1; i <s.length(); i++) {
if (s.charAt(i)==s.charAt(i-1)){
count++;
}else {
if (count >1){
stringBuilder.append(count);
}
stringBuilder.append(s.charAt(i-1));
count=1;
}
}
System.out.println(stringBuilder.toString());
}
写在最后:这种固定a-z小写字母的算法,应该可以用int【】记录a-z的字节码来做,但是一时真是想不起来了,最后的最后以上解法测试的用例比较少,如果有问题还请各位大佬指教一下,有更优的解法也欢迎各位大佬赐教
**9.18补充:**其实一开始
if (count > 1){
stringBuilder.append(count);
}
stringBuilder.append(temp);
的判断是写成了这种比较呆比较拉的样子
if (count > 1){
stringBuilder.append(count).append(temp);
}else{
stringBuilder.append(temp);
}
然后现在感觉一开始的temp其实也不是很有必要,一开始这样用为的是减少string的charAt()方法的调用,后面发现其实都是些if,进去的也就那么一次两次的,没啥变化