每日一道算法题 12(2023-12-20)

 字符串加密
 题目
给出原文字符串str,通过对字符串的每个字母进行改变来实现加密,加密方式是在每一个字母str[i]偏移特定数组元素a[i]的量。
数组a的前三位已经赋值:a[0]=1,a[1]=2,a[2]=4,
当i>=3时,数组元素a[i]=a[i-1]+a[i-2]+a[i-3]。
例如:原文abcde加密后bdgkr,其中偏移量分别是1,2,4,7,13。
a[i] 的偏移量超过26后,就不是字符串。所以需要处理
公式为 (s[i]+a[i]-97)%26+97 计算出还是小写字符。

单n 为50时,偏移量会达到10562230626642 超过Integer 所以用long


输入描述:
第一行是整数n(1<=n<=1000),表示n组测试数据。 每组数据包含一行,原文str(只含有小写字母,长度大于0小于50)。
输出描述:
每组测试数据输出一行,表示密文。
示例

输入
1
xy
输出
ya

示例2
输入
2
xy
abcde
输出
ya
bdgkr

package com.tarena.test.B20;

import java.util.Scanner;

/**
 * @author Administrator
 *
 */
public class B21 {

    public static void main(String[] args) {
        try(Scanner sc = new Scanner(System.in)){
            int n = sc.nextInt();
            String[] lines = new String[n];
            for(int i=0;i                 lines[i] = sc.next();
            }
            
            for(int i= 0;i                 System.out.println(resultStr(lines[i]));
            }
        }
    }
    
    public static String resultStr(String str) {
        int n = str.length();
        //初始化a数组
        long[] a = new long[n];
        if(n>0) a[0] = 1;
        if(n>1) a[1] = 2;
        if(n>2) a[2] = 4;
        if(n>3) {
            for(int i=3;i                 a[i]=a[i-1]+a[i-2]+a[i-3];
            }
        }
        //为字符串的每一个字符添加a[i]偏移量
        char[] arr = str.toCharArray();
        for(int i=0;i             arr[i]= (char)((a[i]+arr[i]-97)%26+97);
        }
        return new String(arr);
    }
}
了解知识点

1、ASCCII 大写字母时 65~90,小写字母是97~122,数字是48~57

你可能感兴趣的:(算法,算法,java)