华为OD机试题库《C++》限时优惠 9.9
华为OD机试题库《Python》限时优惠 9.9
华为OD机试题库《JavaScript》限时优惠 9.9
针对刷题难,效率慢,我们提供一对一算法辅导, 针对个人情况定制化的提高计划(全称1V1效率更高)。
看不懂有疑问需要答疑辅导欢迎私VX: code5bug
对称就是最大的美学,现有一道关于对称字符串的美学。已知:
相信你已经发现规律了,没错!就是第 i 个字符串 = 第 i - 1 号字符串取反 + 第 i - 1 号字符串;
取反(R->B, B->R);
现在告诉你n和k,让你求得第n个字符串的第k个字符是多少。(k的编号从0开始)
第一行输入一个T,表示有T组用例;
解析来输入T行,每行输入两个数字,表示n,k
输出T行表示答案;
输出 “blue” 表示字符是B;
输出 “red” 表示字符是R。
备注:输出字符串区分大小写,请注意输出小写字符串,不带双引号。
输入:
5
1 0
2 1
3 2
4 6
5 8
输出:
red
red
blue
blue
blue
说明:第 1 个字符串:R -> 第 0 个字符为R 第 2 个字符串:BR -> 第 1 个字符为R 第 3 个字符串:RBBR -> 第 2 个字符为B 第 4 个字符串:BRRBRBBR -> 第 6 个字符为B 第 5 个字符串:RBBRBRRBBRRBRBBR -> 第 8 个字符为B
输入:
1
64 73709551616
输出:
red
这道题目属于递归与分治类型的算法题。通过观察字符串的生成规律,可以发现每个字符串都是由前一个字符串取反后拼接前一个字符串本身构成的。因此,可以通过递归或迭代的方式,逐步缩小问题规模,找到第n个字符串的第k个字符。
解题思路
- 规律分析:
- 第i个字符串由两部分组成:前半部分是第i-1个字符串的取反,后半部分是第i-1个字符串本身。
- 例如,第3个字符串 “RBBR” 是由第2个字符串 “BR” 取反得到 “RB”,然后拼接 “BR” 得到 “RBBR”。
- 递归/分治思想:
- 对于第n个字符串的第k个字符:
- 如果k位于字符串的前半部分(即k < 2^(n-2)),则问题转化为求第n-1个字符串的第k个字符的取反。
- 如果k位于字符串的后半部分(即k >= 2^(n-2)),则问题转化为求第n-1个字符串的第k - 2^(n-2)个字符。
- 递归的终止条件是n=1时,直接返回 ‘R’。
- 优化:
- 使用迭代代替递归,避免递归栈的开销。
- 通过维护一个布尔变量
covert
来记录当前是否需要取反,初始为false
(不取反)。- 每次根据k的位置调整
covert
的值,并更新n和k的值,直到n=1。时间复杂度
- 对于每个测试用例,最多需要迭代n次(n最多为64),因此时间复杂度为O(n)。
- 总的时间复杂度为O(T * n),其中T是测试用例的数量(最多100),n的最大值为64,因此总的时间复杂度是O(6400),非常高效。
空间复杂度
- 除了输入和输出的存储外,算法只使用了常数级别的额外空间(几个变量),因此空间复杂度为O(1)。
import java.util.Scanner;
/**
* @author code5bug
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt(); // 读取测试用例数量
for (int i = 0; i < T; i++) {
// 读取n和k,使用long类型避免溢出(题目约束k < 2^(n-1),n最多64,所以long足够)
long n = scanner.nextLong();
long k = scanner.nextLong();
boolean covert = false; // 标记是否需要颜色翻转
// 逐步分解问题,直到n=1
while (n > 1) {
n--;
long halfLen = 1L << (n - 1); // 计算前半部分的长度:2^(n-1)
if (k >= halfLen) { // 如果k在后半部分
k -= halfLen; // 调整k的位置
} else { // 如果k在前半部分
covert = !covert; // 标记颜色翻转
}
}
// 根据covert输出结果
System.out.println(covert ? "blue" : "red");
}
scanner.close();
}
}
希望这个专栏能让您熟练掌握算法, 。
整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。