leetcode_middle_9_481. Magical String

题意:

给定1和2组成的字符串,1和2描述了本身1或者2连续出现的次数。给定一个数字N,返回这种字符串前N个数中1的个数。

分析:

1 2   2  1 1  2  1  2  2 1  2  2......

1 22 11 2 1 22 1 22 11 2 11 22 ......

比如122就确定了1+2+2=5个数除去自身就是后面两个数,可以知道的是,后面两个数是2个1或者两个2.比如11,那么就再影响了了后面两个数不连续。比如22就影响了后面的四个数,可能出现 : 1122 1111 2222 2211

所以我们知道两个事:第一个:表示出现个数的字符串比较短,能决定后面的。第二个:这种决定是不一定的(有多种可能)

那么有多种可能怎么办呢?我们继续回到题目给出的字符串:发现1,2是间隔的。所以,这个字符串在开头确定的前提下就已经被确定了。

所以我们动态的构造它直到N,在过程中计数。

再来分析规律:比如122后面为什么是11:

第一:第三个数2决定了是两个数。

第二:第三个数是2决定了该是1了。

归纳一般规律:我们需要知道探究对象前面的是1还是2,还需要知道对应应该添加几个。

public class Solution {
   public int magicalString(int n) { //1 22 11 2 1 2         2 1 22 11 2 11 22 .....
        StringBuilder sb = new StringBuilder("122");
        int count = 1;
        int slow = 2;  //应该指示接下来
        int fast = 2;  //应该指示当前最末
        while(sb.length() < n){
            if(sb.charAt(slow) == '1'){   //表示接下来的是1个
                if(sb.charAt(fast) == '1')   //表示当前是1
                    sb.append(2);            //那么就应该添加2
                else if(sb.charAt(fast) == '2'){
                    sb.append(1);
                    count++;
                }
                fast++;
            }else if(sb.charAt(slow) == '2'){  //表示接下来的是2个
                if(sb.charAt(fast) == '1')
                    sb.append(22);
                else if(sb.charAt(fast) == '2'){
                    sb.append(11);
                    count += 2;
                }
                fast += 2;
            }
            slow++;
        }
        if(sb.length() > n && sb.charAt(n) == '1')  //最后一次如果是append(11),那么有可能多出一个1
            count--;
        return count;
    }
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值