牛客网华为机试【简单密码】

文章目录

  • 题目描述
  • 题目分析
  • java 代码
  • 结果

题目描述

密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。哇哈哈. 接下来渊子要在密码之上再加一套密码,虽然简单但也安全。

假设渊子原来一个BBS上的密码为zvbo9441987,为了方便记忆,他通过一种算法把这个密码变换成YUANzhi1987,这个密码是他的名字和出生年份,怎么忘都忘不了,而且可以明目张胆地放在显眼的地方而不被别人知道真正的密码。

他是这么变换的,大家都知道手机上的字母1--1, abc--2, def--3, ghi--4, jkl--5, mno--6, pqrs--7, tuv--8 wxyz--9, 0--0,就这么简单,渊子把密码中出现的小写字母都变成对应的数字数字和其他的符号都不做变换

声明:密码中没有空格,而密码中出现的大写字母则变成小写之后往后移一位,如:X,先变成小写,再往后移一位,不就是y了嘛,简单吧。记住,z往后移是a哦

输入描述:
输入包括多个测试数据。输入是一个明文,密码长度不超过100个字符,输入直到文件结尾

输出描述:
输出渊子真正的密文

示例
输入

YUANzhi1987

输出

zvbo9441987

题目分析

使用加密后的密码串,解出原始的密码。
首先,小写字母,需要对应手机键盘上的内容,去得到一个数字。
我这里使用一个二维数组保存键盘上的对应关系,当然,你也可以使用 map 来存储。

String[][] strings = new String[][]{
                {"abc","2"},{"def","3"},
                {"ghi","4"},{"jkl","5"},{"mno","6"},
                {"pqrs","7"},{"tuv","8"},{"wxyz","9"}
        };

现在来看这个数组,我是这麽想的,在输入的密码串中,先转换为一个字符数组,使用 toCharArray 方法,接着循环这个字符数组,在循环的内部,再去遍历这个二维数组,当二维数组的 strings[j][0] 元素包含了当前循环到的字符时,表示当前字符的数值就是 strings[j][1]

举个例子,就是说,假如当前的字符是 'z' ,那么循环到 string[7][0] 的位置时,得到对应字符串是 “wxyz”,当判断 z 包含在 wxyz 中时,就取出 “9” 拼接到最终结果上。

然后是大写字母的处理,先转换为小写字母。
在同为字符的情况下 :

// 32
System.out.println('a' - 'A');

因此, 字符 'a' == (char)('A' + 32)
然后是后移,就是在转换为小写之后,在加1;
特殊照顾一下 ‘z’,当转换为小写之后,字符若果是 ‘z’ ,就拼接上 ‘a’。

最后,是数字:不变,直接拼接。

java 代码

import java.util.Scanner;

/**
 * Created by Feng on 2020/2/17 14:08
 * CurrentProject's name is java8
 * 简单密码
 */
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        String[][] strings = new String[][]{
                {"abc","2"},{"def","3"},
                {"ghi","4"},{"jkl","5"},{"mno","6"},
                {"pqrs","7"},{"tuv","8"},{"wxyz","9"}
        };

        while(input.hasNext()){
            String line = input.next();
            char[] chars = line.toCharArray();

            StringBuilder sb = new StringBuilder();
            for (char aChar : chars) {
                // 小写字母
                if (aChar >= 'a' && aChar <= 'z') {
                    for (String[] string : strings) {
                        boolean contains = string[0].contains(String.valueOf(aChar));
                        if (contains) {
                            sb.append(string[1]);
                        }
                    }
                }

                // 大写字母
                if(aChar >= 'A' && aChar <= 'Z'){
                    // 转换为小写字母并向后移一位
                    int temp = aChar + 32;
                    // 当为 z 时,后移一位是 a
                    if((char)temp == 'z'){
                        sb.append('a');
                    } else {
                        sb.append((char)(temp + 1));
                    }
                }

                // 数字
                if(aChar >= '0' && aChar <= '9'){
                    sb.append(aChar);
                }
            }

            System.out.println(sb);
        }
    }
}

结果

牛客网华为机试【简单密码】_第1张图片

你可能感兴趣的:(牛客网华为机试)