每日一题-外观数组

Leetcode

题目类型:模拟,递归。
题目意思:统计字符相同的位数
思路:首先想到的就是递归解决,而且思路也比较清晰,但是找相同字符数的时候显得代码有点冗余了,一开始是这样的。

public String countAndSay(int n) {

        if(n == 1)return "1";

        String last = countAndSay(n-1);
        int sn = last.length();
        int num = 0;
        StringBuilder sb = new StringBuilder();
        if(sn == 1){
            sb.append("1"+last.charAt(0));
            return sb.toString();
        }

        char t1=0,t2=0;
        for(int i=0; i<sn-1; i++){
            t1=last.charAt(i);
            t2=last.charAt(i+1);
            if(t1 == t2){
                num++;
                if(i == sn-2){
                    num++;
                    sb.append(num+""+t1);
                }
            }else{
                num++;
                sb.append(num+""+t1);
                num = 0;
            }
        }

        if(t1!=t2){
            sb.append("1"+last.charAt(sn-1));
        }

        return sb.toString();

    }

确实,本来很清晰的代码,由于又要判断一个字符的情况,又要解决最后一个字符的情况,写在一起感觉就很混乱,后来看了下大佬们的题解,有的是用迭代的方式写的,然后有一个双指针来判断位置,我觉得挺好的这个方法,然后修改了一下自己的代码,就变成这样了。

public String countAndSay(int n) {

        if(n == 1)return "1";

        String last = countAndSay(n-1);//递归解决n-1的问题@[TOC]
        int sn = last.length();
        int start = 0,pos = 1;//双指针
        StringBuilder sb = new StringBuilder();

        char t1=0,t2=0;

        for(int i=1; i<sn; i++){//统计字符相同的个数
            t1=last.charAt(start);
            t2=last.charAt(i);
            if(t1 != t2){
                sb.append(pos-start+""+t1);
                start = pos;
            }

            pos++;
        }
        sb.append(pos-start+""+last.charAt(start));

        return sb.toString();

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值