为了防止被黑客取到客户输入的密码,某银行在登陆软件上以屏幕输入法输入密码,该输入法有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
});