题目描述
对称就是最大的美学,现有一道关于对称字符串的美学。已知:
第1 个字符串 | R |
第2 个字符串 | BR |
第3 个字符串 | RBBR |
第4 个字符串 | BRRBRBBR |
第5 个字符串 | RBBRBRRBBRRBRBBR |
第i 个字符串= 第i - 1 号字符串的取反+ 第i - 1号字符串;
取反(R->B, B->R);
现在告诉你n 和k,让你求得第n 个字符串的第k 个字符是多少。(k 的编号从0 开始)
输入描述
第一行输入一个T,表示有T 组用例;
接下里输入T 行,每行输入两个数字,表示n, k
1 <= T <= 100;
1 <= n <= 64;
0 <= k < 2^(n-1);
输出描述
输出T 行表示答案;
输出"blue" 表示字符是B;
输出"red" 表示字符是R;
题目分析
在这里先构建字符串,然后根据输入去找对应的字符串显然是不可取的
可以先观察一下,第 n 个字符串的长度为 2 ^ ( n - 1 ),那么k存在两种情况
1、k > 2 ^ ( n - 2 ):即 k 大于字符串长度的一半,那么第 n 个字符串的 k 处的字符就等于第 n - 1 个字符串的第 k - 2 ^ ( n - 2 ) 个字符
2、k <= 2 ^ ( n - 2 ):即 k 小于等于字符串长度的一半,那么第 n 个字符串的 k 处的字符就等于第 n - 1 个字符串的第 k 个字符取反
3、为了便于取反操作,这里使用 1 表示不变,-1 表示取反
不取反 | 1 |
取反1次 | 1 * (-1) = -1 |
取反2次 | (-1) * (-1) = 1 |
取反3次 | 1 * (-1) = -1 |
完整代码
public class SymmetricString {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(in.readLine());
for (int i = 0; i < t; i++) {
String[] split = in.readLine().split(" ");
int n = Integer.parseInt(split[0]);
long k = Long.parseLong(split[1]);
method(n, k);
}
}
public static void method(int n, long k){
k++;
int temp = 1;
while (n != 0){
if (k > Math.pow(2, n - 2)){
k -= Math.pow(2, n - 2);
}else {
temp *= -1;
}
n--;
}
if (temp == 1){
System.out.println("red");
}else {
System.out.println("blue");
}
}
}