我们在笔试时经常会遇到这样的题目。给出两个字符串,一个是没加密的,一个是加密之后的,让你找出加密规则,并且实现输入任意合法字符串进行加密或者解密操作。具体题目如下:

01_简单密码

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

题目分析

这种问题一般解题思路就是遍历整个字符串,对其中的某一个或者某一些字符进行对应的转换。比如大小写转换,左移n个位置或者右移n个位置等等。这样肯能会导致代码很繁多,我们可以使用字典数组和原字符数组来解决这个问题。比如建立一个数组为
C[]={0,1,2,3,4,5,6,7,8,9},我们称他为原字符数组。再建立一个数组为D[]={2,3,4,5,6,7,8,9,0,1},我们称他为字典数组。两个数组中的元素一一对应。比如输入为s=“12345”,则加密后s1=“34567”。我们在进行加密操作时,只需要在原字符数组中找到每个字符的位置,并输出字典数组中对应位置的字符即可。进行解密操作时,刚好和加密相反,只需要在字典数组中找到每个字符的位置,并输出原字符数组中对应位置的字符。

Java代码实现:

import java.util.Scanner;

public class 简单密码 {

    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String str = sc.next();
    String str1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    String str2 = "bcdefghijklmnopqrstuvwxyza222333444555666777788899990123456789";
    char[] ch1 = str1.toCharArray();
    char[] ch2 = str2.toCharArray();
    for (int i = 0; i < str.length(); i++) {
        for (int j = 0; j < ch1.length; j++) {
        if (str.charAt(i) == ch1[j])
            System.out.print(ch2[j]);
        }
    }
    }
}

02_字符串加密

已知一段消息由26个小写字母和0-9这10个数字构成。
现在需要设计一种简单的字典加密法和解密法,把消息加密为简单密文,或者把一段密文还原为原文。
说明:
本字典加解密算法中用的字典由36个字符组成,分别为:
abcdefghijkimnopqrstuvwxyz0123456789,加密前、后的字符串也是由这36个字符组成。
输入字典格式为36个字符组成的串D。串中每个字符表示A中对应位置处的字符加密后的结果,如
A:abcdefghijklmnopqrstuvwxyz0123456789
D:fghijklmnopqrstuvwxyz0123456789abcde
表示a=>f,b=>g..0=>5..9=>e
请根据输入对字符串进行加密或解密。
输入描述:
第一行是字典,由36个字符数字组成,具体含义见题目中的相关说明。
第二行是模式,1表示加密,0表示解密
第三行是待加密字符串或待解密字符串,长度小于10000
输出描述:
使用对应字典加密或解密后的字符串。
示例1输入输出示例仅供调试,后台判题数据-般不包含示例
输入:
fghijklmnopqrstuvwxyz0123456789abcde
1
a3579hello
输出:
f8acemjqqt

题目分析

这道题的要点在于:字典是由你自己定义的,并不固。解法还是和第一题一样。

Java代码实现:

import java.util.Scanner;

public class 字符串加密 {
    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String D = sc.nextLine();
    String A = "abcdefghijklmnopqrstuvwxyz0123456789";
    char[] ch1 = A.toCharArray();
    char[] ch2 = D.toCharArray();
    int flag = sc.nextInt();
    String input = sc.next();
    /*加密过程,当找到字符在A中的位置,输出字典D中对应位置的字符*/
    if ((flag == 1)) {
        for (int i = 0; i < input.length(); i++) {
        for (int j = 0; j < ch1.length; j++) {
            if (input.charAt(i) == ch1[j])
            System.out.print(ch2[j]);
        }
        }
    }
    /*解密过程,当找到字符在字典D中的位置,输出A中对应位置的字符*/
    if ((flag == 0)) {
        for (int i = 0; i < input.length(); i++) {
        for (int j = 0; j < ch2.length; j++) {
              if (input.charAt(i) == ch2[j])
            System.out.print(ch1[j]);
        }
        }
    }
    }
}

03_字符串加解密

1、对输入的字符串进行加解密,并输出。
2加密方法为:
当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;
当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;
其他字符不做变化。
3、解密方法为加密的逆过程。

说明:
1、字符串以\0结尾。
2、字符串最长100个字符。
输入描述:
输入一串要加密的密码
输入一串加过密的密码
输出描述:
输出加密后的字符
输出解密后的字符
示例1
输入
abcdefg
BCDEFGH
输出
BCDEFGH
abcdefg

题目分析

这个题和第二题大同小异,因为要涉及加密解密两个操作,所以我们定义两个字典数组。而且一次要输入两个字符串,就不能一边判断一边输出,因此我们定义两个空字符串来接收加密或解密后的字符。

Java代码实现:

import java.util.Scanner;

public class 字符串加解密 {

    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String str1 = sc.next();// 要加密的字符串
    String str2 = sc.next();// 要解密的字符串
    String JIA = "";
    String JIE = "";
    String strA = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    String strB = "bcdefghijklmnopqrstuvwxyzaBCDEFGHIJKLMNOPQRSTUVWXYZA1234567890";//加密字典
    String strC = "zabcdefghijklmnopqrstuvwxyZABCDEFGHIJKLMNOPQRSTUVWXY9012345678";//解密字典
    char[] ch1 = strA.toCharArray();
    char[] ch2 = strB.toCharArray();
    char[] ch3 = strC.toCharArray();
    //加密过程
    for (int i = 0; i < str1.length(); i++) {
        for (int j = 0; j < ch1.length; j++) {
        if (str1.charAt(i) == ch1[j])
            JIA = JIA + ch2[j];
        }

    }
    //解密过程
    for (int i = 0; i < str2.length(); i++) {
        for (int j = 0; j < ch2.length; j++) {
        if (str2.charAt(i) == ch1[j])
            JIE = JIE + ch3[j];
        }
    }
    System.out.println(JIA);
    System.out.println(JIE);
    }
}
  • 下一篇博客主题:正则表达式