题意整理。
- 输入两行字符串,对其中一行加密,对另一行进行解密。
- 加密方式为:如果是小写字母,则转化为大写,右移一位;如果是'z',则直接变为'A'。如果是大写字母,则转化为小写,右移一位;如果是'Z',则直接变为'a'。如果是数字,右移一位;如果是'9',直接变为'0'。
- 解密方式为加密的逆操作。
方法一(模拟)
1.解题思路
加密:
- 首先将输入的字符串转为字符数组。
- 按照给定的加密方式,改变对应位置字符的值。主要利用了ascii码,大写字母和小写字母的ascii码相差32,比如'a'的ascii码为97,'A'的ascii码为65。另外0的ascii码为48。
解密:
- 首先将输入的字符串转为字符数组。
- 同样利用了ascii码,操作均为加密的逆操作。
图解展示:
2.代码实现
import java.util.Scanner;
public class Main{
public static void main(String[] args){
//标准输入
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
//输入待加密的密码
String s1=sc.next();
//输入加密过的密码
String s2=sc.next();
System.out.println(encode(s1));
System.out.println(decode(s2));
}
}
private static String encode(String s){
int n=s.length();
char[] arr=s.toCharArray();
for(int i=0;i<n;i++){
if(arr[i]>='a'&&arr[i]<='z'){
//如果是'z',直接变为'A'
if(arr[i]=='z'){
arr[i]='A';
}
//如果是'a'-'y',小写转大写,然后右移一位
else{
arr[i]=(char)(arr[i]+1-32);
}
}
else if(arr[i]>='A'&&arr[i]<='Z'){
//如果是'Z',直接变为'a'
if(arr[i]=='Z'){
arr[i]='a';
}
//如果是'A'-'Y',大写转小写,然后右移一位
else{
arr[i]=(char)(arr[i]+1+32);
}
}
else if(arr[i]>='0'&&arr[i]<='9'){
//如果是'9',直接变为'0'
if(arr[i]=='9'){
arr[i]='0';
}
//如果是'0'-'8',右移一位,48对应'0'的ascii码
else{
arr[i]=(char)(arr[i]-'0'+1+48);
}
}
}
return String.valueOf(arr);
}
private static String decode(String s){
int n=s.length();
char[] arr=s.toCharArray();
for(int i=0;i<n;i++){
if(arr[i]>='a'&&arr[i]<='z'){
//如果是'a',直接变为'Z'
if(arr[i]=='a'){
arr[i]='Z';
}
//如果是'b'-'z',小写转大写,然后左移一位
else{
arr[i]=(char)(arr[i]-1-32);
}
}
else if(arr[i]>='A'&&arr[i]<='Z'){
//如果是'A',直接变为'z'
if(arr[i]=='A'){
arr[i]='z';
}
//如果是'B'-'Z',大写转小写,然后左移一位
else{
arr[i]=(char)(arr[i]-1+32);
}
}
else if(arr[i]>='0'&&arr[i]<='9'){
//如果是'0',直接变为'9'
if(arr[i]=='0'){
arr[i]='9';
}
//如果是'1'-'9',左移一位,48对应'0'的ascii码
else{
arr[i]=(char)(arr[i]-'0'-1+48);
}
}
}
return String.valueOf(arr);
}
}
3.复杂度分析
- 时间复杂度:假设输入字符串的长度为n,需要遍历字符串中所有字符,所以加密和解密的时间复杂度均为。
- 空间复杂度:不需要额外的空间,所以空间复杂度为。
方法二(利用io流)
1.解题思路
思路和方法一基本一致,不同的是通过io流操作来处理输入的数据。
2.代码实现
import java.io.*;
public class Main{
public static void main(String[] args) throws Exception{
//io输入
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
//待加密、解密的密码
String s1,s2;
while((s1=br.readLine())!=null){
s2=br.readLine();
System.out.println(encode(s1));
System.out.println(decode(s2));
}
}
private static String encode(String s){
int n=s.length();
char[] arr=s.toCharArray();
for(int i=0;i<n;i++){
if(arr[i]>='a'&&arr[i]<='z'){
//如果是'z',直接变为'A'
if(arr[i]=='z'){
arr[i]='A';
}
//如果是'a'-'y',小写转大写,然后右移一位
else{
arr[i]=(char)(arr[i]+1-32);
}
}
else if(arr[i]>='A'&&arr[i]<='Z'){
//如果是'Z',直接变为'a'
if(arr[i]=='Z'){
arr[i]='a';
}
//如果是'A'-'Y',大写转小写,然后右移一位
else{
arr[i]=(char)(arr[i]+1+32);
}
}
else if(arr[i]>='0'&&arr[i]<='9'){
//如果是'9',直接变为'0'
if(arr[i]=='9'){
arr[i]='0';
}
//如果是'0'-'8',右移一位,48对应'0'的ascii码
else{
arr[i]=(char)(arr[i]-'0'+1+48);
}
}
}
return String.valueOf(arr);
}
private static String decode(String s){
int n=s.length();
char[] arr=s.toCharArray();
for(int i=0;i<n;i++){
if(arr[i]>='a'&&arr[i]<='z'){
//如果是'a',直接变为'Z'
if(arr[i]=='a'){
arr[i]='Z';
}
//如果是'b'-'z',小写转大写,然后左移一位
else{
arr[i]=(char)(arr[i]-1-32);
}
}
else if(arr[i]>='A'&&arr[i]<='Z'){
//如果是'A',直接变为'z'
if(arr[i]=='A'){
arr[i]='z';
}
//如果是'B'-'Z',大写转小写,然后左移一位
else{
arr[i]=(char)(arr[i]-1+32);
}
}
else if(arr[i]>='0'&&arr[i]<='9'){
//如果是'0',直接变为'9'
if(arr[i]=='0'){
arr[i]='9';
}
//如果是'1'-'9',左移一位,48对应'0'的ascii码
else{
arr[i]=(char)(arr[i]-'0'-1+48);
}
}
}
return String.valueOf(arr);
}
}
3.复杂度分析
- 时间复杂度:假设输入字符串的长度为n,需要遍历字符串中所有字符,所以加密和解密的时间复杂度均为。
- 空间复杂度:不需要额外的空间,所以空间复杂度为。