Skip to content

Latest commit

 

History

History
159 lines (124 loc) · 3.62 KB

File metadata and controls

159 lines (124 loc) · 3.62 KB

English Version

题目描述

神奇字符串 s 仅由 '1''2' 组成,并需要遵守下面的规则:

  • 神奇字符串 s 的神奇之处在于,串联字符串中 '1''2' 的连续出现次数可以生成该字符串。

s 的前几个元素是 s = "1221121221221121122……" 。如果将 s 中连续的若干 12 进行分组,可以得到 "1 22 11 2 1 22 1 22 11 2 11 22 ......" 。每组中 1 或者 2 的出现次数分别是 "1 2 2 1 1 2 1 2 2 1 2 2 ......" 。上面的出现次数正是 s 自身。

给你一个整数 n ,返回在神奇字符串 s 的前 n 个数字中 1 的数目。

 

示例 1:

输入:n = 6
输出:3
解释:神奇字符串 s 的前 6 个元素是 “122112”,它包含三个 1,因此返回 3 。 

示例 2:

输入:n = 1
输出:1

 

提示:

  • 1 <= n <= 105

解法

方法一:模拟

直接模拟字符串添加。

时间复杂度 $O(n)$,空间复杂度 $O(n)$

Python3

class Solution:
    def magicalString(self, n: int) -> int:
        s = list('1221121')
        i = 5
        while len(s) < n:
            if s[i] == '1':
                s.append('2' if s[-1] == '1' else '1')
            else:
                s.extend(list('22' if s[-1] == '1' else '11'))
            i += 1
        return s[:n].count('1')

Java

class Solution {
    public int magicalString(int n) {
        StringBuilder s = new StringBuilder("1221121");
        int i = 5;
        while (s.length() < n) {
            char c = s.charAt(s.length() - 1);
            if (s.charAt(i) == '1') {
                s.append(c == '1' ? '2' : '1');
            } else {
                s.append(c == '1' ? "22" : "11");
            }
            ++i;
        }
        int ans = 0;
        for (i = 0; i < n; ++i) {
            if (s.charAt(i) == '1') {
                ++ans;
            }
        }
        return ans;
    }
}

C++

class Solution {
public:
    int magicalString(int n) {
        string s = "1221121";
        int i = 5;
        while (s.size() < n) {
            if (s[i] == '1') {
                s += s.back() == '1' ? "2" : "1";
            } else {
                s += s.back() == '1' ? "22" : "11";
            }
            ++i;
        }
        return count(s.begin(), s.begin() + n, '1');
    }
};

Go

func magicalString(n int) int {
	s := []byte("1221121")
	i := 5
	for len(s) < n {
		c := s[len(s)-1]
		if s[i] == '1' {
			if c == '1' {
				s = append(s, '2')
			} else {
				s = append(s, '1')
			}
		} else {
			if c == '1' {
				s = append(s, '2')
				s = append(s, '2')
			} else {
				s = append(s, '1')
				s = append(s, '1')
			}
		}
		i++
	}
	return bytes.Count(s[:n], []byte("1"))
}

...