题目主要信息

1、将字符串中的小写字母变成对应的数字,大写字幕变成小写后向后移动一位

2、密码中没有空格,多组输入输出。

方法一:暴力求解

具体做法

直接判断当前字符是属于什么,然后根据对应的要求转换为对应的数字和小写字母

可以得到如下判断语句

//判断是否属于大写字幕
if (c >= 'A' && c < 'Z') {
                    c = (char) (c + 'b' - 'A');
                } else if (c == 'Z') {
                    c = 'a';
                } else if (c>='a' && c<='c') {
                    c = '2';
                } else if (c>='d' && c<='f') {
                    c = '3';
                } else if (c>='g' && c<='i') {
                    c = '4';
                } else if (c>='j' && c<='l') {
                    c = '5';
                } else if (c>='m' && c<='o') {
                    c = '6';
                } else if (c>='p' && c<='s') {
                    c = '7';
                } else if (c>='t' && c<='v') {
                    c = '8';
                } else if (c>='w' && c<='z') {
                    c = '9';
                }

Java代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String s;
        while((s = bf.readLine())!=null){
            StringBuilder sb = new StringBuilder();
            for (int i=0;i<s.length();i++){
                char c = s.charAt(i);
                //直接使用if else判断
                if (c >= 'A' && c < 'Z') {
                    c = (char) (c + 'b' - 'A');
                } else if (c == 'Z') {
                    c = 'a';
                } else if (c>='a' && c<='c') {
                    c = '2';
                } else if (c>='d' && c<='f') {
                    c = '3';
                } else if (c>='g' && c<='i') {
                    c = '4';
                } else if (c>='j' && c<='l') {
                    c = '5';
                } else if (c>='m' && c<='o') {
                    c = '6';
                } else if (c>='p' && c<='s') {
                    c = '7';
                } else if (c>='t' && c<='v') {
                    c = '8';
                } else if (c>='w' && c<='z') {
                    c = '9';
                }
                sb.append(c);
            }
            System.out.println(sb.toString());
        }

    }
}

复杂度分析

时间复杂度:O(n)O(n),主要体现在遍历字符串

空间复杂度:O(1)O(1),一个存结果的临时变量

方法二:借助数组

具体做法

首先把小写字母对应的数字存入数组中

char[] a = {'2', '2', '2', '3', '3', '3', '4', '4', '4', '5', '5', '5','6', '6', '6', '7', '7', '7', '7', '8', '8', '8', '9', '9', '9', '9'}; 

alt

在遍历的过程中如果发现是小写字母就在数组中找到对应的数字即可。

Java代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String s;
        char[] a = {'2', '2', '2', '3', '3', '3', '4', '4', '4', '5', '5', '5',
                     '6', '6', '6', '7', '7', '7', '7', '8', '8', '8', '9', '9', '9', '9'}; while((s = bf.readLine())!=null){
            StringBuilder sb = new StringBuilder();
            for (int i=0;i<s.length();i++){
                char c = s.charAt(i);
                //直接使用if else判断
                if (c >= 'A' && c <= 'Z') {
                    c += 33;
                    //判断是否需要循环 
                    if(c>'z'){
                        c -=26;
                    }
                }else if(c >='a' && c <='z'){
                    c = a[c-'a'];
                }
                sb.append(c);
            }
            System.out.println(sb.toString());
        }

    }
}

复杂度分析

  • 时间复杂度:O(n)O(n),遍历字符串。
  • 空间复杂度:O(1)O(1),k是26,是小写字母的长度。