【算法题-java/js】为了防止被黑客取到客户输入的密码...

为了防止被黑客取到客户输入的密码,某银行在登陆软件上以屏幕输入法输入密码,该输入法有9个按钮,每个按钮上有不多于3个字母,字母有先后顺序,按第一个字母需要用鼠标点击按钮1次,第二个字母需要点击2次,第三个字母需要点击3次。按键时,若连续两个字母都在同一个按钮上,则输入前一个字母后需要等待一小段时间。
假设,用户的输入习惯是:点击按钮需要1单位时间,等待一小段时间为2单位时间。某次登陆的时候,9个按钮上的字母分别为azc dwf gti jql mon pkr shu vex yb,
求该客户输入密码花费的时间?
输入:
该客户的密码都是小写字母[a~z],密码长度<=16。
输出:
该客户输入密码的时间
示例:
输入 ac---->输出 6
输入 zc---->输出 7
输入 zw---->输出 4

/**
 * @author 瞎琢磨先生 https://github.com/xiazuomo/xzm-utils.git
 * @date 2022/9/24 0:09
 */
public class Code1 {

    public static void main(String[] args) {
        getTime("ac");
        getTime("zc");
        getTime("zw");
        getTime("abcd");
        getTime("fffffff");
        getTime("");
    }

    private static void getTime(String pwd) {
        if (pwd == null || pwd.length() > 16) {
            throw new RuntimeException(String.format("pwd(%s)为空或长度大于 16", pwd));
        }
        String str = "azc dwf gti jql mon pkr shu vex yb";
        String[] keyArr = str.split(" ");

        // 记录某按键上的多个字符串在数组中的索引的位置(eg. "azc"的位置为 0)
        Map<String, Integer> map = new HashMap<>();
        for (int i = 0; i < keyArr.length; i++) {
            // eg. "azc"
            final String keyStr = keyArr[i];
            // {a, z, c}
            final String[] strArr = keyStr.split("");
            for (String oneWord : strArr) {
                // a: 0,z: 0,c: 0
                map.put(oneWord, i);
            }
        }

        // 遍历 pwd 的各个字符,计算时间
        final String[] pwdArr = pwd.split("");
        Integer lastIndex = null;
        int time = 0;
        for (String s : pwdArr) {
            // ac
            // a: 0,c: 0
            final Integer index = map.get(s);
            // a 在 azc 的 1 位置上
            time += keyArr[index].indexOf(s);
            if (index.equals(lastIndex)) {
                time += 2;
            }
            time += 1;
            lastIndex = index;
        }
        System.out.println(pwd + " 总耗时:" + time);
    }

}
var readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
var i = 0;

var strArr = "azc dwf gti jql mon pkr shu vex yb".split(" ")
var mapObj = {}
var place = null
var time = 0
rl.on('line', function (line) {
    for(var i = 0; i < strArr.length; i++) {
        var str = strArr[i].split('')
        for (var j = 0; j < str.length; j++) {
            mapObj[str[j]] = i
        }
    }
    var lineArr = line.split('')
    for (var k = 0; k < lineArr.length; k++) {
        var chart = lineArr[k]
        var index = mapObj[lineArr[k]]
        if (strArr[index].indexOf(chart) > -1) {
            time += strArr[index].indexOf(chart) + 1
            if (place === index) {
                time += 2
            }
            place = index
        }
    }
    console.log(time)
    mapObj = {}
    place = null
    time = 0
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值