牛客网华为机试【字符串加解密】

题目描述

  1. 对输入的字符串进行加解密,并输出。

  2. 加密方法为:当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;其他字符不做变化

  3. 解密方法为加密的逆过程。

接口描述:

实现接口,每个接口实现1个基本操作:

void Encrypt (char aucPassword[], char aucResult[]):在该函数中实现字符串加密并输出

说明:

1、字符串以\0结尾。

2、字符串最长100个字符。

int unEncrypt (char result[], char password[]):在该函数中实现字符串解密并输出

说明:

1、字符串以\0结尾。
2、字符串最长100个字符。

输入描述:
输入一串要加密的密码
输入一串加过密的密码

输出描述:
输出加密后的字符
输出解密后的字符

示例
输入

abcdefg
BCDEFGH

输出

BCDEFGH
abcdefg

题目分析

加密的处理,一共有4个点:

  1. 小写字母 => 转换为后一个字符,并转换为大写字符(特殊的,z 要更换为 A
  2. 大写字母 => 转换位后一个字符,并转换为小写字符(特殊的,Z 要更换为 a
  3. 数字 => 转换为后一个数字字符(特殊的,9 要更换为 0
  4. 其他 => 不变

解密时是这个过程的逆过程。

我的做法:
将输入的字符串转换为字符数组,使用加密的判断转换字符,最后使用StringBuilderappend 方法进行拼接即可。

java 代码

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

/**
 * Created by Feng on 2020/2/20 12:31
 * CurrentProject's name is java8
 * 字符串加解密
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

        String line;
        while ((line = bufferedReader.readLine()) != null){
            // 加密
            System.out.println(encrypt(line));

            // 再接收一行
            line = bufferedReader.readLine();
            // 解密
            System.out.println(unEncrypt(line));
        }
    }

    /**
     * 加密方法
     * @param password 原始密码
     * @return 加密后的密码
     */
    private static String encrypt(String password){
        StringBuilder sb = new StringBuilder();

        char[] chars = password.toCharArray();
        for (char aChar : chars) {
            // 小写字母
            if(aChar >= 'a' && aChar <= 'z'){
                if(aChar == 'z'){
                    sb.append('A');
                } else {
                    sb.append((char)(aChar + 1 - 32));
                }
                continue;
            }

            // 大写字母
            if(aChar >= 'A' && aChar <= 'Z'){
                if(aChar == 'Z'){
                    sb.append('a');
                } else {
                    sb.append((char)(aChar + 1 + 32));
                }
                continue;
            }

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

            // 其他字符
            sb.append(aChar);
        }

        return sb.toString();
    }

    /**
     * 解密
     * @param password 加密的密码
     * @return 真实密码(解密后的密码)
     */
    private static String unEncrypt(String password){
        StringBuilder sb = new StringBuilder();

        char[] chars = password.toCharArray();
        for (char aChar : chars) {
            // 小写字符
            if(aChar >= 'a' && aChar <= 'z'){
                if(aChar == 'a'){
                    sb.append('Z');
                } else {
                    sb.append((char)(aChar - 32 - 1));
                }
                continue;
            }

            // 大写字符
            if(aChar >= 'A' && aChar <= 'Z'){
                if(aChar == 'A'){
                    sb.append('z');
                } else {
                    sb.append((char)(aChar + 32 -1));
                }
                continue;
            }

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

            // 其他字符
            sb.append(aChar);
        }

        return sb.toString();
    }
}

结果

在这里插入图片描述

根据引用,牛客网华为机试题解的JavaScript版本提供了第11到20题的解答。其中包括了数字颠倒、字符串反转、句子逆序、字符串排序、求int型数据在内存中存储时1的个数、购物单、坐标移动、识别有效的IP地址和掩码并进行分类统计、简单错误记录和密码验证合格程序。 根据引用,题目描述了如何将输入的整数以字符串的形式逆序输出。程序不考虑负数的情况,如果数字中包含0,逆序形式也会包含0。 根据引用,题目描述了如何计算输入的正整数在内存中存储时1的个数。题目要求输入一个整数(int类型),并将该数转换成二进制形式后输出其中1的个数。 需要注意的是,输入和输出的具体实现可能因题目而异,以上引用提供了一些示例代码,但并不代表所有题目的通用解法。正确的输入输出取决于具体题目的要求和所给代码的实现方式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [JavsScript牛客网华为机试(11-20)题解](https://blog.csdn.net/weixin_43465339/article/details/110709521)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你家宝宝

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

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

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

打赏作者

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

抵扣说明:

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

余额充值