题目描述

  • 密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。哇哈哈. 接下来渊子要在密码之上再加一套密码,虽然简单但也安全。
    假设渊子原来一个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个字符,输入直到文件结尾
  • 输出描述:
    输出渊子真正的密文
  • 示例1
    输入
    YUANzhi1987
  • 输出
    zvbo9441987

代码和思路

package org.lht.boot.lang.suanfa;

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

/**
* @author haitao.li
* @description: 题目描述
* 密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。哇哈哈. 接下来渊子要在密码之上再加一套密码,虽然简单但也安全。
* 假设渊子原来一个BBS上的密码为zvbo9441987,为了方便记忆,他通过一种算法把这个密码变换成YUANzhi1987,这个密码是他的名字和出生年份,
* 怎么忘都忘不了,而且可以明目张胆地放在显眼的地方而不被别人知道真正的密码。
* 他是这么变换的,大家都知道手机上的字母: 1--1, abc--2, def--3, ghi--4, jkl--5, mno--6, pqrs--7, tuv--8 wxyz--9, 0--0,
* 就这么简单,渊子把密码中出现的小写字母都变成对应的数字,数字和其他的符号都不做变换,
* <p>
* 声明:密码中没有空格,而密码中出现的大写字母则变成小写之后往后移一位,如:X,先变成小写,再往后移一位,不就是y了嘛,简单吧。记住,z往后移是a哦。
* <p>
* <p>
* 输入描述:
* 输入包括多个测试数据。输入是一个明文,密码长度不超过100个字符,输入直到文件结尾
* <p>
* 输出描述:
* 输出渊子真正的密文
* <p>
* 示例1
* 输入
* <p>
* YUANzhi1987
* 输出
* <p>
* zvbo9441987
* @date 2021/4/29 15:06
*/
public class Huawei简单密码 {


/**
* 解决 1--1, abc--2, def--3, ghi--4, jkl--5, mno--6, pqrs--7, tuv--8 wxyz--9, 0--0
* 上面这个问题,可以使用多个if判断。牛客网最优解即多个if
* <p>
* 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';
* }
*
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {


BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str;
StringBuilder builder = new StringBuilder();


while (!(str = reader.readLine()).equals("")) {
char[] chars = str.toCharArray();

for (int i = 0; i < chars.length; i++) {
if (chars[i] >= '0' && chars[i] <= '9') {
continue;
}
if (chars[i] >= 'a' && chars[i] <= 'z') {
if (chars[i] == 'v') {
chars[i] = '8';
} else if (chars[i] == 's') {
chars[i] = '7';
} else if (chars[i] == 'z' || chars[i] == 'y') {
chars[i] = '9';
} else {
int n = chars[i] - 'a' + 1;
int index = n / 3;
if (n % 3 == 0) {
chars[i] = (char) (index + 1 + 48);
} else {
chars[i] = (char) ((index + 2) + 48);
}
}
}
if (chars[i] >= 'A' && chars[i] < 'Z') {
chars[i] = (char) (chars[i] + 33);
}
if (chars[i] == 'Z') {
chars[i] = 'a';
}
}
builder.append(chars);
}
System.out.println(builder.toString());
}


/**
* 数组思维解法
*/
/**
* public static char[] tab = new char[]{'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','0'};
* public static void main(String[] args) throws Exception {
* InputStream in = System.in;
* char c;
* StringBuilder sb = new StringBuilder();
* while((c = (char)in.read()) != '\n') {
* if(c >= 'A' && c < 'Z') {
* c = (char)(c + 33);
* } else if(c == 'Z') {
* c = 'a';
* } else if(c >= 'a' && c <= 'z') {
* c = tab[c - 'a'];
* }
* sb.append(c);
* }
* System.out.println(sb.toString());
* }
*/
}