持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 21 天,点击查看活动详情。
神奇字符串
原题地址
神奇字符串 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 <=
思路分析
- 根据题目描述,可以由前几位的数字构造出后面的字符串;
- 第一位是1,代表出现了 一个1,第二位是 2,代表出现了 两个2,而题目要求字符不能连续出现,因此第三位的2必须用1来表示,也就是两个1;
- 从第二个字符开始,后续的字符都出现在字符之后,因此可以从第二个开始构造;
- 从字符串前三位122向后构造,若遇到奇数位置
str[i]
的,则向后面增加str[i]
个2;若为偶数未知的,则在后面增加str[i]
个 1; - 按照给出的入参
n
来构造字符串,然后计数返回最终结果即可。
AC 代码
/**
* @param {number} n
* @return {number}
*/
var magicalString = function(n) {
let str = [1, 2, 2]
let res = 2
while (str.length < n) {
let ch = res % 2 === 0 ? 1 : 2
if (str[res] === 1) str.push(ch)
else str.push(ch, ch)
res += 1
}
res = 0
for (let i=0; i < n; i++) {
if (str[i] === 1) res += 1
}
return res
};
结果:
- 执行结果: 通过
- 执行用时:56 ms, 在所有 JavaScript 提交中击败了100.00%的用户
- 内存消耗:47.9 MB, 在所有 JavaScript 提交中击败了51.85%的用户
- 通过测试用例:64 / 64