首页 > 解决方案 > 它将反转纯文本,用“*”替换空格,然后根据加密密钥移动纯文本的字母

问题描述

public class pppp {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        String s1;
        s1=input.nextLine();
        char ch[]=new char[s1.length()];
        int x;
        x=input.nextInt();
        int i=0;
        int j=0;
        int h=0;
        for(i=s1.length()-1;i>=0;i--) {
            ch[j]=s1.charAt(i);
            j++;
        }
        System.out.println(ch);
        for(i=0;i<s1.length();i++) {
            if(ch[i]==' ') {
                ch[i]='*';
            }
            else if((ch[i]+x)<122 && ch[i]!='*') {
                ch[i]+=x;
            }
            else if((ch[i]+x-'z')==1) {
                ch[i]='a';
            }
            else if(ch[i]+x-'z'>1) {
                ch[i]='a';
                ch[i]+=((ch[i]+x-'z')-1);
            }
        }
        
        System.out.println(ch);
    }
}

当我尝试打印“megadeth”并给出键 7 时,它将根据它移动字符代替 t,这个'{'来了。

megadeth
7
htedagem
o{lkhnlt

它现在适用于 t 但如果我写 u 而不是 ti 得到 N 这是错误的。这是编辑后的代码。

我能做些什么来解决它?

标签: javastringencryption

解决方案


IIUC,您想要:

  1. 反转你的字符串
  2. 将所有出现的空格字符 ( ' ') 替换为'*'
  3. 对结果字符串的字母执行凯撒键移

以下是使用流执行此操作的方法:

import java.util.Scanner;
import java.util.stream.Collectors;

public class pppp {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        String s1;
        s1=input.nextLine();
        int x;
        x=input.nextInt();

        System.out.println(
            new StringBuilder(s1)
                .reverse().toString()
                .chars()
                .map(c -> c == ' ' ? '*' : c)
                .map(c -> {
                    if (Character.isLetter(c)) {
                        char first = Character.isUpperCase(c) ? 'A' : 'a';
                        return first + (((c - first) + x) % 26);
                    }
                    else return c;
                })
                .mapToObj(c -> Character.toString((char) c))
                .collect(Collectors.joining())
        );
    }
}

以下是计算班次的相关片段:

char first = Character.isUpperCase(c) ? 'A' : 'a';
return first + (((c - first) + x) % 26);

假设您要将字母t移动7 个位置。你的结果应该是一个.

为此,我们首先计算字母表中字母t的索引(从零开始):

index = 't' - 'a' = 116 - 97 = 19

接下来,将 key 添加到index模 26 以获取通过 key 移动的字母的索引。在这种情况下,密钥是 7。

shiftIndex = (index + 7) % 26 = (19 +7) % 26 = 26 % 26 = 0 

最后,您可以像这样计算移位的字符:

result = 'a' + shiftIndex = 'a' + 0 = 'a'

这就是我的解决方案所做的,加上大写字母的附加逻辑。


推荐阅读