小米OJ进阶之路——#71 还是字符串
金头盔飞行员蒋佳冀:知道了不行,熟悉也不够,要真正进入潜意识,成为条件反射才行。
还是字符串
- 序号:#71
- 难度:非常难
- 时间限制:1000ms
- 内存限制:10M
描述
有一个无限长的字符串,只包含数字 1 和 2 ,按照一定的规则变化后,字符串不会发生任何变化。规则如下: 将字符串按1与2进行拆解,计算相邻的1与2的数量,组成的新字符串。
下面是这个字符串的前19位: 1221121221221121122… 按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,表示这个无限长字符串的前N位子串的长度 例如N=6,前6位子串为 122112
输出
正整数 M,表示前N位子串中1的个数
输入样例
4
5
6
输出样例
2
3
3
解题思路
这个题总的来说难度并不是很大,最主要你要知道这个所谓的无限长的字符串是如何生成的,以下是我的一个解题思路:
- 通过新字符串推出原字符串
- 为了方便先声明3~5位长度的两个字符串oldStr,newStr
- 循环
- 因为两组字符串Value一样,newStr[i] = oldStr[i]
- 当newStr[i] == ‘1’ 则根据oldStr最后一位取相反值追加一位
- 当newStr[i] == ‘1’ 则根据oldStr最后一位取相反值追加两位
#include <bits/stdc++.h>
using namespace std;
string oldStr = "12211";
string newStr = "122";
void fun(int index)
{
for (size_t i = 3; i < index; i++)
{
newStr = newStr + oldStr[i];
if (newStr[i] == '1')
{
if (oldStr[oldStr.length() - 1] == '1') oldStr = oldStr + "2";
else oldStr = oldStr + "1";
}
else
{
if (oldStr[oldStr.length() - 1] == '1') oldStr = oldStr + "22";
else oldStr = oldStr + "11";
}
}
}
int main()
{
int index;
cin >> index;
if (index > 3)
fun(index);
cout << count(newStr.begin(), newStr.end(), '1') << endl;
return 0;
}
个人C++基础比较薄弱,代码中都是一些基础的if判断,如果大家有更好的解题思路可以加微信:PFEI1214 进行交流学习