题意整理。

  • 输入一串明文,根据规则加密为密文。
  • 如果是小写字母,按abc--2, def--3, ghi--4, jkl--5, mno--6, pqrs--7, tuv--8 wxyz--9的规则变换。如果是大写字母,转换为小写字母,再后移一位。如果是数字和其它字符,保持不变。

方法一(模拟)

1.解题思路

  • 遍历字符串中所有字符。
  • 如果是小写字母,按对应规则转换后加入到res。如果是大写字母,转小写再后移一位,加入到res。如果是数字和其它字符,直接加入到res。

图解展示: alt

2.代码实现

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        //标准输入
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            //输入明文
            String s=sc.next();
            //记录即将输出的密文
            StringBuilder res=new StringBuilder();
            for(char c:s.toCharArray()){
                //abc对应2
                if(c-'a'>=0&&c-'a'<=2){
                    res.append(2);
                }
                //def对应3
                else if(c-'a'>=3&&c-'a'<=5){
                    res.append(3);
                }
                //ghi对应4
                else if(c-'a'>=6&&c-'a'<=8){
                    res.append(4);
                }
                //jkl对应5
                else if(c-'a'>=9&&c-'a'<=11){
                    res.append(5);
                }
                //mno对应6
                else if(c-'a'>=12&&c-'a'<=14){
                    res.append(6);
                }
                //pqrs对应7
                else if(c-'a'>=15&&c-'a'<=18){
                    res.append(7);
                }
                //tuv对应8
                else if(c-'a'>=19&&c-'a'<=21){
                    res.append(8);
                }
                //wxyz对应9
                else if(c-'a'>=22&&c-'a'<=25){
                    res.append(9);
                }
                //大写字母转小写后移一位
                else if(c>='A'&&c<'Z'){
                    res.append((char)(c+33));
                }
                //如果是Z,直接变为a
                else if(c=='Z'){
                    res.append('a');
                }
                //数字和其它符号不做变换
                else{
                    res.append(c);
                }
            }
            System.out.println(res.toString());
        }

    }
}

3.复杂度分析

  • 时间复杂度:需要遍历字符串中所有的字符,所以时间复杂度为O(n)O(n)
  • 空间复杂度:需要额外常数级别的空间,所以空间复杂度为O(1)O(1)

方法二(利用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 s;
        while((s=br.readLine())!=null){
            //记录即将输出的密文
            StringBuilder res=new StringBuilder();
            for(char c:s.toCharArray()){
                //abc对应2
                if(c-'a'>=0&&c-'a'<=2){
                    res.append(2);
                }
                //def对应3
                else if(c-'a'>=3&&c-'a'<=5){
                    res.append(3);
                }
                //ghi对应4
                else if(c-'a'>=6&&c-'a'<=8){
                    res.append(4);
                }
                //jkl对应5
                else if(c-'a'>=9&&c-'a'<=11){
                    res.append(5);
                }
                //mno对应6
                else if(c-'a'>=12&&c-'a'<=14){
                    res.append(6);
                }
                //pqrs对应7
                else if(c-'a'>=15&&c-'a'<=18){
                    res.append(7);
                }
                //tuv对应8
                else if(c-'a'>=19&&c-'a'<=21){
                    res.append(8);
                }
                //wxyz对应9
                else if(c-'a'>=22&&c-'a'<=25){
                    res.append(9);
                }
                //大写字母转小写后移一位
                else if(c>='A'&&c<'Z'){
                    res.append((char)(c+33));
                }
                //如果是Z,直接变为a
                else if(c=='Z'){
                    res.append('a');
                }
                //数字和其它符号不做变换
                else{
                    res.append(c);
                }
            }
            System.out.println(res.toString());
        }

    }
}

3.复杂度分析

  • 时间复杂度:需要遍历字符串中所有的字符,所以时间复杂度为O(n)O(n)
  • 空间复杂度:需要额外常数级别的空间,所以空间复杂度为O(1)O(1)