题解 | #密码#【自用笔记】
密码
https://ac.nowcoder.com/acm/problem/15318
思路
整体思路:按照题目的要求把整个字符串分到不同层去(不同层可以选择用StringBuffer实现,方便添加新的字母),最后依次输出每一层组成的字符串
难点
怎么把所有字符分配到对应的层呢? (拿题目给的案例举例)
- 题目中的这个案例字符串可以分为3层,我们需要3个StringBuffer分别记录三层的字符串,同时我们将3者放入一个数组中
- 从下面这张图中可以看出来,我们是按照1、2、3,3、2、1,1、2、3...这样的顺序往不同层中添加新字母;
- 因此我们需要一个变量辅助来我们在1~3之间“变换”
- “变换”,就需要自增或者是自减,那什么情况下一个自增 / 自减?
- 这样,我们就又引入一个变量来辅助我们判断,当前我们是处于“自增阶段”还是“自减阶段”(也就是去判断我们是按照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();
}
}
}