C++ 中的神奇字符串

c++server side programmingprogramming

假设有一个字符串。该字符串称为神奇字符串 S,它仅由"1"和"2"组成,并遵循以下规则 −

  • 字符串 S 之所以神奇,是因为将字符"1"和"2"的连续出现次数连接起来会生成字符串 S 本身。
  • 字符串 S 的前几个组成部分如下 − S = "122112122122112122……"
  • 如果我们将 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 ......

现在假设我们有一个整数 N 作为输入,找出神奇字符串 S 中前 N 个数字中"1"的数量。因此,如果输入为 6,则输出为 3,因为神奇字符串中的前 6 个元素为"12211"。这包含三个 1,所以返回 3。

为了解决这个问题,我们将遵循以下步骤 −

  • 如果 n <= 0,则返回 0;如果 n <= 3,则返回 1
  • ret := 1,创建一个大小为 n 的数组 arr
  • arr[0] := 1,arr[1] := 2,arr[2] := 2
  • head := 2,tail := 3 且 num := 1
  • while tail
  • for i in range 0 to arr[head] – 1
    • arr[tail] := num
    • if num 为 1 且 tail < n,然后将 ret 加 1
    • 将 tail 加 1
    • 如果 tail >= n,则跳出循环
  • num = num 异或 3
  • 将 head 加 1
  • return ret
  • 让我们看看下面的实现以便更好地理解 −

    示例

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
       public:
       int magicalString(int n) {
          if(n <= 0) return 0;
          if(n <= 3) return 1;
          int ret = 1;
          vector <int> arr(n);
          arr[0] = 1;
          arr[1] = 2;
          arr[2] = 2;
          int head = 2;
          int tail = 3;
          int num = 1;
          while(tail < n){
             for(int i = 0; i < arr[head]; i++){
                arr[tail] = num;
                if(num == 1 && tail < n) ret++;
                tail++;
                if(tail >= n) break;
             }
             num ^= 3;
             head++;
          }
          return ret;
       }
    };
    main(){
       Solution ob;
       cout << (ob.magicalString(6));
    }
    

    输入

    6
    

    输出

    3
    

    相关文章