华为机考 ~ 偏移量实现字符串加密

该篇博客介绍了一个字符串加密算法,通过给定的偏移数组a对每个字母进行位移,数组a的元素由斐波那契序列生成。算法实现包括读取输入字符串,计算偏移量,并生成加密后的密文。示例中展示了如何将原文abcde加密为bdgkr。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.题目描述:给出原文字符串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。
  • 输入描述:第一行是整数n,表示n组测试数据。每组数据包含一行,原文str(只含有小写字母,长度大于0小于50)。
  • 输出描述:每组测试数据输出一行,表示密文。
 //字符串偏移 xy -> ya , abcde -> bdgkr
    public  static void  tm001(){
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            String line1 = scanner.nextLine();
            int count = Integer.parseInt(line1);
            List<String> stringList = new ArrayList<>();
            int maxLen = 0;
            for (int i = 0; i < count; i++) {
                String input = scanner.nextLine();
                if (input.length() > maxLen){
                    maxLen = input.length();
                }
                stringList.add(input);
            }
            // 直接根据最大长度算出 移动步数集合 只计算一次
            int[] moveArr = new int[Math.max(maxLen, 3)];
            moveArr[0] = 1;
            moveArr[1] = 2;
            moveArr[2] = 4;
            for (int i = 3; i < maxLen; i++) {
                //添加的时候 就进行取余 防止叠加超过int范围
             //考虑到 Integer.MAX_VALUE = 2147483647,直接对结果进行取余 保证每个数字都不大于26
                moveArr[i]  = (moveArr[i-1] + moveArr[i-2] + moveArr[i-3]) % 26;// 26个字母
            }

            for (String line : stringList) {
                char[] chars = line.toCharArray();
                StringBuilder stringBuilder = new StringBuilder();
                for (int i = 0; i < chars.length; i++) {
                    int move = moveArr[i];
                    // 'a' = 97 , 'z' = 122
                    // 防止 出现25 + 25 等情况大于 26的情况出现 再次进行取模
                    int result = ((chars[i] - 97) + move)%26 + 97; // 26个字母 下标从0开始~25
                    stringBuilder.append((char)result);
                }
                System.out.println(stringBuilder);
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值