首页 > 其他分享 >HJ36 字符串加密

HJ36 字符串加密

时间:2023-07-19 21:22:17浏览次数:41  
标签:加密 String keys public char 字符串 sb HJ36

1. 题目

读题

HJ36 字符串加密

 

 

这道题的意思是让您使用一种加密技巧,把一个字符串转换成另一个字符串。

这种加密技巧的原理是这样的:

  • 首先,您需要选择一个单词作为密钥,比如TRAILBLAZERS。
  • 然后,您需要把这个单词中重复的字母去掉,只保留第一个出现的字母,比如TRAILBZES。
  • 接着,您需要把这个单词放在字母表的下面,然后用剩下的字母按照顺序填充完整,比如:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
T R A I L B Z E S C D F G H J K M N O P Q U V W X Y
  • 最后,您需要把要加密的字符串中的每个字母用上面对应的字母替换,注意保持大小写不变,比如:
Attack AT DAWN -> Tpptad TP ITVH
nihao ni -> le

 

 

考查点

 

2. 解法

思路

 

代码逻辑

 

具体实现

 

import java.util.*;
public class Main{

    // 定义一个函数,根据密钥生成新字母表
    public static char[] createNewKey(String key){
        char[] keys=new char[26];
        int index=0;
        for(char c:key.toCharArray()){
            if(!contains(keys,c)){
                keys[index++]=c;
            }
        }
        for(char c:'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.toCharArray()){
            if(!contains(keys,c)){
                keys[index++]=c;
            }
        }
        return keys;
    }

    // 定义一个函数,根据新字母表加密字符串
    public static String encryptString(String str, char[] keys){
        char[] oldKey="ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
        StringBuilder sb=new StringBuilder();
        for(char c:str.toCharArray()){
            if(Character.isLetter(c)){
                int i=oldKey[c-'A'];
                char newC=keys[i];
                if(Character.isLowerCase(c)){
                    newC=Character.toLowerCase(newC);
                }
                sb.append(newC);
            }else{
                sb.append(c);
            }
        }
        return sb.toString();
    }

    // 定义一个函数,判断一个数组是否包含某个字符
    public static boolean contains(char[] arr,char c){
        for(char a:arr){
            if(a==c){
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            // 输入密钥和需要加密的字符串
            String key=sc.next().toUpperCase();
            String str=sc.next();
            // 调用函数生成新字母表
            char[] keys=createNewKey(key);
            // 调用函数加密字符串
            String res=encryptString(str,keys);
            System.out.println(res);
        }
    }
}

自行实现

public class HJ036 {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println(encode(sc.nextLine(), sc.nextLine()));
}


public static String encode(String key, String info) {
StringBuffer sb = new StringBuffer();
for (char c : key.toLowerCase().toCharArray()) {
if (sb.toString().indexOf(c) == -1) {
sb.append(c);
}
}

int diff = sb.length();
char cur = 'a';
for (int i = 0; i < 26 - diff; i++) {

while (sb.toString().indexOf(cur) != -1) {
cur = (char) (cur + 1);
}
sb.append(cur);

}

String newSeq = sb.toString();
StringBuffer ans = new StringBuffer();
boolean flag = false;
for (char c : info.toCharArray()) {
if (!Character.isLetter(c)) {
ans.append(c);
continue;
}
flag = Character.isUpperCase(c);
c = Character.toLowerCase(c);
char d = newSeq.charAt(c - 'a');
if (flag) {
d = Character.toUpperCase(d);
}
ans.append(d);
}

return ans.toString();
}
}

3. 总结

标签:加密,String,keys,public,char,字符串,sb,HJ36
From: https://www.cnblogs.com/shoshana-kong/p/17548658.html

相关文章

  • 剑指 Offer 20. 表示数值的字符串
    题目:#遇到数字:一定合法#遇到'.'且合法需要满足条件:之前没出现过'.',之前没出现过'e'#遇到'e'且合法需要满足条件:之前没出现过'e',之前出现过整数#遇到'+'或者'-'且合法需要满足条件:位于字符串第一位,或者紧跟在'e'之后classSolution{public:boolisNumber(st......
  • RSA 加密
    //通用RSA加密,可兼容.Net6.0以下stringCommonRSAEncrypt(stringpublicKeyBase64,stringplaintext){try{byte[]publicKeyBytes=Convert.FromBase64String(publicKeyBase64);AsymmetricKeyParameterpublicKeyParam=PublicKeyFactory.Crea......
  • MSSQL STRING_SPLIT(把字符串拆分成集合)
    语法:STRING_SPLIT(string,separator)参数说明:string:任何字符类型(例如nvarchar、varchar、nchar或char)的表达式separator:任何字符类型(例如nvarchar(1)、varchar(1)、nchar(1)或char(1))的单字符表达式,用作串联子字符串的分隔符根据字符把字符串拆分为集合S......
  • .Net 对RSA加密结果跟JAVA加密结果不一致问题处理
    stringpublicRsaKey="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6UCsvO/M/Q51ydlxvuvwy8W9yXkAWLLiG5eA2Duha9cr/XoWrQcETf7PRMNYaQs616PGhj0tnPfxfDltmeqTJQf8rHNxevIZ9nQ0N0/8PIlVszubpMyAHnEis2OLMnLENGyepAlabFGDMDPzRpf0ibL0Q/R15BuTzII5gunzAbwIDAQAB";stri......
  • Java 两个字符串相加
    Java两个字符串相加作为一名经验丰富的开发者,我很乐意教你如何实现“Java两个字符串相加”。下面我将详细介绍这个过程,并提供每个步骤所需的代码和注释。过程概述下面是实现“Java两个字符串相加”的步骤概览:步骤描述1创建两个字符串变量2输入两个待相加的字......
  • 数据库PostgreSQL PG 字符串拼接,大小写转换,substring
    前言PostgreSQL数据库简称pg数据库。本文主要介绍使用pg数据库时,字符串的一些常用操作。例如:多个字符串如何连接在一起,字符串如何大小写转换,删除字符串两边的空格,查找字符位置,查找子字符串等。一、多个字符串如何连接,拼接?pg的字符串连接使用||,注意不是+1.将2个字符串hello......
  • php导出带加密的excel
    最近需要用yii2做一个导出excel带密码设置的功能,找了好多都没有达到目的,后来终于在git找到了一个,不过得php版本7.4以上https://github.com/nick322/secure-spreadsheet$objWriter=newXlsx($objPHPExcel);$file_path=$title.'.xlsx';$objWriter->save......
  • Mysql sum 返回了字符串
    Mysqlsum返回了字符串在Mysql数据库中,SUM函数用于计算数值型列的总和。然而,有时候我们会遇到SUM函数返回字符串的情况,这可能会导致数据处理和分析的问题。在本篇文章中,我们将讨论为什么SUM函数会返回字符串以及如何解决这个问题。为什么SUM函数返回字符串?当SUM函数......
  • 字符串哈希
    题目描述给定一个长度为n的字符串,再给定m个询问,每个询问包含四个整数l1,r1,l2,r2,请你判断[l1,r1]和[l2,r2]这两个区间所包含的字符串子串是否完全相同。字符串中只包含大小写英文字母和数字。输入格式第一行包含整数n和m,表示字符串长度和询问次数。第二行包含一个长度为......
  • mysql字符串类型面试题
    mysql有哪些字符串类型?MySQL中有以下几种常见的字符串类型:CHAR:固定长度字符串,最多可以存储255个字符。VARCHAR:可变长度字符串,最多可以存储65535个字符。TEXT:用于存储较长的文本字符串,最多可以存储65535个字符。TINYTEXT:用于存储非常短的文本字符串,最多可以......