题解 | #简单密码#

简单密码

http://www.nowcoder.com/practice/7960b5038a2142a18e27e4c733855dac

题目主要信息

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,是小写字母的长度。
华为机试 文章被收录于专栏

本专栏主要用于分享华为机试的题解,希望对大家有所帮助。

全部评论
借助数组这个好,看起来简洁多了
点赞 回复 分享
发布于 2023-01-31 16:24 四川

相关推荐

10-13 16:58
门头沟学院 Java
面了100年面试不知...:一周七天,一天去一家上班😍😍😍
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
7
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务