
Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Magical String in C++
Suppose there is a string. That string is called a magical string S, that 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 components 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 ......
Now suppose we have an integer N as input, find the number of '1's in the first N number in the magical string S. So if the input is like 6, then the output will be 3, as first 6 elements in the magical string is “12211”. This contains three 1s, so return 3.
To solve this, we will follow these steps −
- if n <= 0, then return 0, if n <= 3, then return 1
- ret := 1, make an array arr of size n
- arr[0] := 1, arr[1] := 2, arr[2] := 2
- head := 2, tail := 3 and num := 1
- while tail < n
- for i in range 0 to arr[head] – 1
- arr[tail] := num
- if num is 1 and tail < n, then increase ret by 1
- increase tail by 1
- if tail >= n, then break the loop
- num = num XOR 3
- increase head by 1
- for i in range 0 to arr[head] – 1
- return ret
Let us see the following implementation to get better understanding −
Example
#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)); }
Input
6
Output
3
Advertisements