Chuỗi ma thuật S chỉ chứa '1','2' và tự sinh ra bằng cách đếm độ dài các khối liên tiếp. S = "1221121221221121122...". Tìm số ký tự '1' trong N ký tự đầu.
Ví dụ: N=6 → "122112" có 3 chữ số 1.
Thuật toán (Sinh chuỗi theo quy tắc)
- Khởi tạo
arr[0]=1, arr[1]=2, arr[2]=2. head=2(chỉ số đọc),tail=3(chỉ số ghi),num=1(giá trị ghi).- Khi
:- Ghi
arr[head]lần giá trịnumvàoarr[tail++]. - Đếm số '1' ghi được.
num ^= 3(xen kẽ 1↔2).head++.
- Ghi
Mã nguồn C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int magicalString(int n) {
if (n <= 0) return 0;
if (n <= 3) return 1;
vector arr(n);
arr[0]=1; arr[1]=2; arr[2]=2;
int head=2, tail=3, num=1, ret=1;
while (tail < n) {
for (int i=0; i= n) break;
}
num ^= 3;
head++;
}
return ret;
}
};
int main() {
Solution ob;
cout << ob.magicalString(6); // 3
return 0;
}
Đầu vào / Đầu ra
Input: 6
Output: 3