面试回顾9.15:压缩字符串

面试考了两题,都是比较简单的题,但是由于脱离了百度直接敲代码比较生疏(/滑稽),在有限的时间内还是没有写好,后面完善了一下,顺便记录一下(另外两道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,进去的也就那么一次两次的,没啥变化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值