leetcode481. Magical String

题目要求

A magical string S consists of only '1' and '2' and obeys the following rules:

The string S is magical because concatenating the number of contiguous occurrences of characters '1' and '2' generates the string S itself.

The first few elements of string S is the following: S = "1221121221221121122……"

If we group the consecutive '1's and '2's in S, it will be:

1 22 11 2 1 22 1 22 11 2 11 22 ......

and the occurrences of '1's or '2's in each group are:

1 2 2 1 1 2 1 2 2 1 2 2 ......

You can see that the occurrence sequence above is the S itself.

Given an integer N as input, return the number of '1's in the first N number in the magical string S.

Note: N will not exceed 100,000.

Example 1:
Input: 6
Output: 3
Explanation: The first 6 elements of magical string S is "12211" and it contains three 1's, so return 3.

这题是描述了一个魔法字符串,该字符串完全由数字1和2构成。这个字符串的魔法点在于,如果将该该字符串连续的数字数量进行统计并且构成一个新的字符串,会发现新的字符串与原来的字符串完全相同。 比如1 22 11 2 1 22 1 22 11 2 11 22字符串,经过统计后发现有1个1,2个2,2个1,1个2,1个1,2个2,1个1,2个2,2个1,1个2,2个1,2个2,将统计的数量合并为新的字符串,会发现新的字符串为1 22 11 2 1 22 1 22,和原字符串完全匹配。

思路和代码

用双指针可以快速的解决这个问题。假设让一个指针指向魔法字符串中统计位,将另一个指针指向魔法字符串中的数字位,则可以不断的通过统计位推理出当前的数字位值为多少。如果填入数字位的值为1,则把计数加一。代码如下:

    public int magicalString(int n) {
        if(n == 0) return 0;
        if(n <= 3) return 1;
        int a[] = new int[n+1];
        a[0] = 1; 
        a[1] = 2; 
        a[2] = 2;
        int leftPointer = 2, rightPointer = 3, num = 1, count = 1;
        while(rightPointer < n) {
            for(int i = 0 ; i < a[leftPointer] && rightPointer < n ; i++) {
                a[rightPointer++] = num;
                if(num == 1) {
                    count++;
                }
            }
            leftPointer++;
            num ^= 3;
        }
        return count;
    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • leetcode467. Unique Substrings in Wraparound String

    假设存在一个从a-z26个字母无限循环的字符串s,现在输入一个字符串p,问该字符串有多少个子字符串在s中循环出现?

    眯眯眼的猫头鹰
  • leetcode 459. Repeated Substring Pattern

    直观的思路就是选取所有可能的子字符串,并且将剩余的字符串按照等长截断,将每一段和预期的子字符串进行比较,判断是否相等。代码如下,可以参考注释理解:

    眯眯眼的猫头鹰
  • leetcode394. Decode String

    将一个字符串解码,要求按照次数展开原字符串中的中括号。如3[a]2[bc]对应的字符串就是aaabcbc,即a展开3次,bc展开2次。注意,源字符串中的括号是允...

    眯眯眼的猫头鹰
  • 保障双11,90后美女工程师跟机器人“天巡”草原守机房

    2017年的双11临近,对于多数人来说双11是购物的狂欢节日。而对于90后女孩小花(化名)和机器人“天巡”却是一份特别的责任。 小花是阿里张北数据中心的一名运维...

    机器人网
  • N皇后

    N皇后问题是计算机科学中最为经典的问题之一,该问题可追溯到1848年,由国 际西洋棋棋手马克斯·贝瑟尔于提出了8皇后问题。 将N个皇后放摆放在N*N的棋盘中,互...

    小飞侠xp
  • 动态规划|相邻约束下的最优解(House Robber II )

    01 House Robber II This time, all houses at this place are arranged in a circl...

    double
  • Flutter第1天--初始分析+Dart方言+Canvas简绘

    张风捷特烈
  • Linux服务器性能压力测试

    对于新采购的服务器,需要进行有必要的性能测试。这里选择UnixBench工具进行性能测试。记录如下: 1)安装使用 下面的脚本使用了最新版UnixBench5....

    洗尽了浮华
  • Flutter 省会选择器

    上篇怎么说了Flutter的数据通信简单流程,这次我们基于此写一个plugin实现省会选择器

    大话swift
  • 2018-10-02 你知道怎么new BigDecimal吗?

    https://stackoverflow.com/questions/9795364/java-bigdecimal-precision-problems

    Albert陈凯

扫码关注云+社区

领取腾讯云代金券