前言
在我看来,理解循环队列对我们思考问题的帮助就是:
合理利用“%”的约束,将问题的“越界”重新弹回问题范围内。
本文就是一个例子,循环队列的思想为我快速秒杀本题提供了思路。
题目要求
分析
我们想要实现’z’后是’a’,就相当于让右越界的数值返回左边界内。
这就好比一个常见的特效:一条线从屏幕右侧穿出,又从左侧穿入。
这种思想在我看来和循环队列是很像的。
循环队列在一侧“填满”而“假溢出”之后,会在另一侧填装新的元素。
当然了,队列会有满的问题,但这种思想是很好的。
就好比说“弹球游戏”实现问题约束的方式是用模拟动量守恒的方式进行完全弹性碰撞后的反弹,强制不越界;而这里的解决方式是容许一侧越界后从另一侧回来。
这种思想实现,就是依靠“%”运算符实现的。
但是,这个问题里棘手的一点是:'a’并不是char=0的情况,所以我们应该先让当前char-‘a’,然后+偏移量,最后%26(因为有26个英文字母,这是界内范围),再+‘a’,就能得到我们所求的。
这就是本题所谓的加密解密咯。
AC代码(Java语言描述)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = Integer.parseInt(scanner.nextLine());
char[] password_array = scanner.nextLine().toCharArray();
for (int i = 0; i < password_array.length; i++) {
password_array[i] = (char)((password_array[i] - 'a' + num) % 26 + 'a');
}
System.out.println(new String(password_array));
scanner.close();
}
}