小米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 进行交流学习
在这里插入图片描述

posted @ 2019-09-30 15:45  一只飞哥哥  阅读(109)  评论(0编辑  收藏  举报