LeetCode 每日一题:神奇字符串

29 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 21 天,点击查看活动详情

神奇字符串

原题地址

神奇字符串 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 <=10510^5

思路分析

  1. 根据题目描述,可以由前几位的数字构造出后面的字符串;
  2. 第一位是1,代表出现了 一个1,第二位是 2,代表出现了 两个2,而题目要求字符不能连续出现,因此第三位的2必须用1来表示,也就是两个1;
  3. 从第二个字符开始,后续的字符都出现在字符之后,因此可以从第二个开始构造;
  4. 从字符串前三位122向后构造,若遇到奇数位置 str[i] 的,则向后面增加 str[i] 个2;若为偶数未知的,则在后面增加 str[i] 个 1;
  5. 按照给出的入参 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

END