对称字符串

文章描述了一种关于对称字符串的美学问题,给定一个基于前一个字符串反转并拼接生成下一个字符串的规则。通过分析,提出了一个解决方案,根据字符串长度的一半来确定第n个字符串的第k个字符。代码实现中,使用了指数计算和条件判断来高效地找到答案,输出结果为字符红色(red)或蓝色(blue)。
摘要由CSDN通过智能技术生成

题目描述

对称就是最大的美学,现有一道关于对称字符串的美学。已知:

第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");
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值