神奇字符串
题目描述
神奇字符串的定义为: 只含有1和2, 且将其按照连续的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位中有多少个1 .输入格式:
第一行输入一个T,代表数据组数
接下来的T行,输入N
1 <= N <= 100000输出格式:
对每一组输入,在一行中输出前N位中1的个数。
输入样例:
1 6
输出样例:
3
代码长度限制
16 KB
时间限制
1000 ms
内存限制
64 MB
题目分析
将每一段分组
value = value ^ 3;//确定第p组内元素的value是多少、(1,2)和3异或为(2,1)
count = magic[++p];//创建完第p组所有元素后,获得下一组需要创建的元素个数;
贴一个链接
题目代码
import java.io.FilterOutputStream; import java.util.Scanner; public class 神奇字符串 { public static void main(String[] args) { Scanner sca = new Scanner(System.in); int n = sca.nextInt(); int res = 0;//结果 while (n-- > 0) { int m = sca.nextInt(); //创建神奇的数组 int magic[] = new int[m + 1]; magic[0] = 1;//初始化第一个元素 int tail = 1;//下标 int p = 1;//组别 int value = 1; res = 1; int count = 2;//一组多少个元素 while (tail < m) { value = value ^ 3;//确定第p组内元素的value是多少、(1,2)和3异或为(2,1) while (count-- > 0 && tail < m) { magic[tail++] = value;//赋值 if (value == 1) res++; } count = magic[++p];//创建完第p组所有元素后,获得下一组需要创建的元素个数; } System.out.println(res); } } }