【算法练习】09:神奇字符串

题目:神奇字符串(中等)


思路:

 双指针构造神奇字符串是本题的关键。


答案:

class Solution:
    def magicalString(self, n: int) -> int:
        # 先构造神奇数字字符串
        # 关键1:那么如何通过现有的开头字符串来构造剩下的字符串呢?
        # 初试化 s = '122'
        # 双指针 i (组的大小) j (组的位置)
        # 因为相邻组中的数字一定不会相同,所以我们可以通过 j 的前一个位置的数来判断当前需要填入的组中的数字
        s = '122'
        if n < 4:
            return 1
        
        s = [''] * n   # 快速创建n个元素,全是''的列表
        s[:3] = "122"  # 打包赋值。 相当于 s[0] = '1', s[1] = '2', s[2] = '2'
        res = 1        # 1的个数
        i, j = 2, 3    # i是当前组的大小,j是当前组的位置
        while j < n:
            size = int(s[i])  # 这是什么意思?
            # s[j - 1] 是当前元素的前一个元素的值,3-2=1,3-1=2,因为要和前一个元素不同,所以这样来判断当前组是2,还是1
            num = 3 - int(s[j - 1])  
            while size and j < n:    # 在 j 这个位置上插入 num
                s[j] = str(num)
                if num == 1:
                    res += 1
                j += 1               # 插入一个num后位置j后移1
                size -= 1            # 插入一个num后长度减1
            i += 1                   # 当前组的大小是由前一个数决定的,j后移1,i也要后移1

        return res



if __name__ == '__main__':
    n = 6
    s = Solution()
    print(s.magicalString(n))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值