神奇字符串 s
仅由 '1'
和 '2'
组成,并需要遵守下面的规则:
- 神奇字符串 s 的神奇之处在于,串联字符串中
'1'
和'2'
的连续出现次数可以生成该字符串。
s
的前几个元素是 s = "1221121221221121122……"
。如果将 s
中连续的若干 1
和 2
进行分组,可以得到 "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
方法一:模拟
直接模拟字符串添加。
时间复杂度
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')
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;
}
}
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');
}
};
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"))
}