思路

整体思路:按照题目的要求把整个字符串分到不同层去(不同层可以选择用StringBuffer实现,方便添加新的字母),最后依次输出每一层组成的字符串

难点

怎么把所有字符分配到对应的层呢? (拿题目给的案例举例)

  • 题目中的这个案例字符串可以分为3层,我们需要3个StringBuffer分别记录三层的字符串,同时我们将3者放入一个数组中
  • 从下面这张图中可以看出来,我们是按照1、2、3,3、2、1,1、2、3...这样的顺序往不同层中添加新字母;
  • 因此我们需要一个变量辅助来我们在1~3之间“变换” alt
  • “变换”,就需要自增或者是自减,那什么情况下一个自增 / 自减?
  • 这样,我们就又引入一个变量来辅助我们判断,当前我们是处于“自增阶段”还是“自减阶段”(也就是去判断我们是按照1、2、3更新每层,还是按照3、2、1更新每层)

总结

  • 创建一个包含3个元素的StringBuffer数组,用于记录每层的字符串———对应代码中的 StringBuffer数组 res
  • 创建一个变量辅助我们操作数组的三个元素(更新3层字符串),也就是数组的索引———对应代码中的 int值 index
  • 创建一个变量辅助我们判断应该让数组索引自增还是自减———对应代码中的布尔值 flag

代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        while (T-- > 0) {
            int n = sc.nextInt();
            String s = sc.next();
            if(n == 1) {
                System.out.println(s);
                continue;
            }
            StringBuilder[] res = new StringBuilder[n];
            for (int i = 0; i < n; i++) {
                res[i] = new StringBuilder();
            }
            int index = 0;
            boolean flag = false;
            for (int i = 0; i < s.length(); i++) {
                if(index == n - 1 || index == 0)flag = !flag;
                res[index].append(s.charAt(i));
                if(flag)index++;
                else index--;
            }
            for (int i = 0; i < n; i++) {
                System.out.print(res[i].toString());
            }
            System.out.println();
        }
    }
}