题目:神奇字符串(中等)
思路:
双指针构造神奇字符串是本题的关键。
答案:
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))