【对称美学】
对称就是最大的美学,现有一道关于对称字符串的美学。已知:
第1个字符串:R
第2个字符串:BR
第3个字符串:RBBR
第4个字符串:BRRBRBBR
第5个字符串:RBBRBRRBBRRBRBBR
1
2
3
4
5
相信你已经发现规律了,没错!就是第 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);
代码解题:暴力破解存储会爆内存
import java.util.Scanner;
/**
*
* 注释已经很详细了,这里简单说明一下代码逻辑:
* 首先读取输入的n和k;
* 然后初始化第一个字符串为R;
* 依次构造第2~n个字符串,每次构造时先将上一个字符串取反,然后再拼接得到当前字符串;
* 最后获取第n个字符串的第k个字符并输出即可。
*/
public class OdAb28 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 输入n
int k = sc.nextInt(); // 输入k
String res = "R"; // 初始化第一个字符串为R
// 依次构造第2~n个字符串
for (int i = 2; i <= n; i++) {
String temp = reverse(res); // 取反
res = temp + res; // 拼接
}
System.out.println("第n个字符:" + res); // 输出结果
char ans = res.charAt(k); // 获取第n个字符串的第k个字符
System.out.println("n的第k个字符:" + ans); // 输出结果3
}
// 取反
private static String reverse(String s) {
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
if (c == 'R') {
sb.append('B');
} else {
sb.append('R');
}
}
return sb.toString();
}
}