华为机试-021-简单-HJ21.简单密码


一、描述

现在有一种密码变换算法。
九键手机键盘上的数字与字母的对应: 1–1, abc–2, def–3, ghi–4, jkl–5, mno–6, pqrs–7, tuv–8 wxyz–9, 0–0,把密码中出现的小写字母都变成九键键盘对应的数字,如:a 变成 2,x 变成 9.
而密码中出现的大写字母则变成小写之后往后移一位,如:X ,先变成小写,再往后移一位,变成了 y ,例外:Z 往后移是 a 。
数字和其它的符号都不做变换。
数据范围: 输入的字符串长度满足 1 ≤ n ≤ 100

1.1、输入描述

输入一组密码,长度不超过100个字符。

1.2、输出描述

输出密码变换后的字符串

二、示例

2.1、示例1

输入:

YUANzhi1987

输出:

zvbo9441987

三、答案(java)

3.1、方法一

package com.tzq.hwod;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class Main {
	// 定义map容器存储按键对应数字字符的容器
	private static Map<String, String> map = new HashMap<>();
	// 静态初始化、加载map容器
	static {
		map.put("1", "1");
		map.put("abc", "2");
		map.put("def", "3");
		map.put("ghi", "4");
		map.put("jkl", "5");
		map.put("mno", "6");
		map.put("pqrs", "7");
		map.put("tuv", "8");
		map.put("wxyz", "9");
		map.put("0", "0");
	}

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			String str = scanner.nextLine();
			char[] chars = str.toCharArray();
			// 构造buffer容器存储转换后的字符串
			StringBuffer buffer = new StringBuffer();
			for (char c : chars) {
				// 如果是正整数则不需要进行加密
				if (c >= '0' && c <= '9') {
					buffer.append(String.valueOf(c));
				} else if (c >= 'A' && c <= 'Y') { // 如果是A~Y的大写字母则需要将其+32位转换成小写再向后移1位
					char newChar = (char) (c + 32 + 1);
					buffer.append(String.valueOf(newChar));
				} else if (c == 'Z') { // 如果是Z则加密成a
					buffer.append("a");
				} else {
					// 去除map容器中的key与字符进行校验并加密
					Set<String> keys = map.keySet();
					for (String k : keys) {
						if (k.contains(String.valueOf(c)))
							buffer.append(map.get(k));
					}
				}
			}
			System.out.print(buffer.toString());
		}
	}
}

在这里插入图片描述

四、答案(python 3)

4.1、方法一

懒鬼思路

#!/usr/bin/python
# -*- coding: UTF-8 -*-

while True:
    try:
        A = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
        B = "22233344455566677778889999bcdefghijklmnopqrstuvwxyza0123456789"
        list1 = []
        list2 = []
        for i in A:
            list1.append(i)
        for i in B:
            list2.append(i)
        C = []
        a = input()
        for i in a:
            if i in list1:
                C.append(list2[list1.index(i)])
            else:
                C.append(i)
        print(''.join(C))
    except:
        break

在这里插入图片描述

4.2、方法二

粗暴解法

#!/usr/bin/python
# -*- coding: UTF-8 -*-

while True:
    try:
        s = input()
        res = []
        for i in s:
            if i.isdigit():
                res.append(i)
            elif i.isupper() and i != 'Z':
                res.append(chr(ord(i.lower()) + 1))
            elif i == 'Z':
                res.append('a')
            else:
                if i in 'abc':
                    res.append('2')
                elif i in 'def':
                    res.append('3')
                elif i in 'ghi':
                    res.append('4')
                elif i in 'jkl':
                    res.append('5')
                elif i in 'mno':
                    res.append('6')
                elif i in 'pqrs':
                    res.append('7')
                elif i in 'tuv':
                    res.append('8')
                else:
                    res.append('9')
        print(''.join(res))
    except:
        break

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tzq@2018

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值