力扣第59场双周赛题目
- 刷题链接
https://leetcode-cn.com/problems/minimum-time-to-type-word-using-special-typewriter/
- 题目描述
有一个特殊打字机,它由一个 圆盘 和一个 指针 组成, 圆盘上标有小写英文字母 ‘a’ 到 ‘z’。只有 当指针指向某个字母时,它才能被键入。指针 初始时 指向字符 ‘a’ 。
每一秒钟,你可以执行以下操作之一:
将指针 顺时针 或者 逆时针 移动一个字符。
键入指针 当前 指向的字符。
给你一个字符串 word ,请你返回键入 word 所表示单词的 最少秒数
示例 1:
输入:word = “abc”
输出:5
解释:
单词按如下操作键入:
花 1 秒键入字符 ‘a’ in 1 ,因为指针初始指向 ‘a’ ,故不需移动指针。
花 1 秒将指针顺时针移到 ‘b’ 。
花 1 秒键入字符 ‘b’ 。
花 1 秒将指针顺时针移到 ‘c’ 。
花 1 秒键入字符 ‘c’ 。
- 分析
相邻两字母间的距离可通过字母间的ASCII码做差得到,因为转盘是圆形的,所以每次都要判断如何作差才能获得最短距离,例外不要忘记相邻两字母相等的情况。
- 参考解题
class Solution {
public int minTimeToType(String word) {
int flag = 0;
char[] arr = word.toCharArray();
if(arr[0] == 'a'){
flag = flag + 1;
}
if(arr[0] - 'a' > 0){
flag += Math.min( (arr[0] - 'a'),(26 - (arr[0] - 'a')) )+ 1;
}
if(arr[0] - 'a' < 0){
flag += Math.min( ('a' - arr[0]),(26 - ('a' - arr[0])) )+ 1;
}
for( int i = 1; i < arr.length ; ++i){
if((arr[i] - arr [i-1]) > 0){
flag += Math.min( (arr[i] - arr [i-1]),(26 - (arr[i] - arr [i-1])) )+ 1;
}
if((arr[i] - arr [i-1]) < 0){
flag += Math.min( (arr[i-1] - arr [i]),(26 - (arr[i-1] - arr [i])) )+ 1;
}
if((arr[i] - arr [i-1]) == 0){
flag += 1;
}
}
return flag;
}
}