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