【华为OD机试真题 JS】字符串加密

题目

给出原文字符串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)。
  • 输出描述:每组测试数据输出一行,表示密文。

示例

示例1

  • 输入
    1
    xy
  • 输出
    ya

示例2

  • 输入
    2
    xy
    abcde
  • 输出
    ya
    bdgkr

思路

  • 偏移量计算-使用递归
  • charCodeAt()知道字母的ASCII码,与26个字母的下标找关系

以下代码自己构造了一个函数,没有像牛客网上构造输入输出,可以自己考虑下哦~

代码

// 26个字母
let letter = 'abcdefghijklmnopqrstuvwxyz';
// 加密字符串的方法
let protectStr = function(num, arr) {
    // 偏移量计算-使用递归
    let pianyi = function (i) {
        if (i === 0) {
            return 1;
        } else if (i === 1) {
            return 2;
        } else if (i === 2) {
            return 4;
        } else if (i >= 3) {
            return pianyi(i-1)+pianyi(i-2)+pianyi(i-3);
        }
    }
   // 提前知道a和z的ASCII码 
    const zCharCode = 'z'.charCodeAt();
    const aCharCode = 'a'.charCodeAt();
    let res = '';
    for (var i = 0; i < num; i++) {
        for (var j = 0; j < arr[i].length; j++) {
            let originChar = parseInt(arr[i][j].charCodeAt());
            let pianyiNum = parseInt(pianyi(j))
            let sum = originChar + pianyiNum;
            let index;
            if (sum <= zCharCode) {
            // 计算letter字符串的下标
                    index = sum - aCharCode;
            } else {
                    index = sum - zCharCode - 1;
            }
            // 最后的结果
            res += letter.charAt(index);
        }
        // 这里是为了输出好能一行一行的输出,所以加了一个分隔区分一下
        if (i < num -1) {
            res += '-';
        }
    }
    console.log(res.split('-').join(`\n`));
}

protectStr(3,['ab','abcde', 'abcde']);

在这里插入图片描述

运用到的知识点技巧

  • 递归
  • ‘a’.charCodeAt()方法,返回字符a的ASCII码
  • str.charAt(num)方法,返回str字符串中下标为num的字符
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倏存

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值