列表

详情


1165. 单行键盘

我们定制了一款特殊的键盘,所有的键都 排列在一行上 。

给定一个长度为 26 的字符串 keyboard ,来表示键盘的布局(索引从 025 )。一开始,你的手指在索引 0 处。要输入一个字符,你必须把你的手指移动到所需字符的索引处。手指从索引 i 移动到索引 j 所需要的时间是 |i - j|

您需要输入一个字符串 word 。写一个函数来计算用一个手指输入需要多少时间。

 

示例 1:

输入:keyboard = "abcdefghijklmnopqrstuvwxyz", word = "cba"
输出:4
解释:从 0 号键移动到 2 号键来输出 'c',又移动到 1 号键来输出 'b',接着移动到 0 号键来输出 'a'。
总用时 = 2 + 1 + 1 = 4. 

示例 2:

输入:keyboard = "pqrstuvwxyzabcdefghijklmno", word = "leetcode"
输出:73

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int calculateTime(string keyboard, string word) { } };

python3 解法, 执行用时: 60 ms, 内存消耗: 16.2 MB, 提交时间: 2023-10-15 17:48:00

class Solution:
    def calculateTime(self, keyboard: str, word: str) -> int:
      kb = dict(zip(keyboard, range(len(keyboard))))
      t = kb[word[0]]
      for i in range(len(word)-1):
        t += abs(kb[word[i+1]]-kb[word[i]])
      return t

java 解法, 执行用时: 3 ms, 内存消耗: 40.4 MB, 提交时间: 2023-10-15 17:47:36

class Solution {
   public int calculateTime(String keyboard, String word) {
       int[] keyIndices = new int[26];

       // 获取每一个键的索引
       for (int i = 0; i < keyboard.length(); i++)
           keyIndices[keyboard.charAt(i) - 'a'] = i;

       // 将上一个索引初始化为起始索引 0。
       int prev = 0;
       int result = 0;

       // 计算总次数。
       for (char c : word.toCharArray()) {
           // 将前一个索引到当前字母的索引的距离添加到结果中。
           result += Math.abs(prev - keyIndices[c - 'a']);

           // 将上一个索引更新为下一个迭代的当前索引。
           prev = keyIndices[c - 'a'];
       }
       return result;
   }
}

cpp 解法, 执行用时: 12 ms, 内存消耗: 7.2 MB, 提交时间: 2023-10-15 17:47:19

class Solution {
public:
   int calculateTime(string keyboard, string word) {
       int sum = 0, pre = 0;
       for (int i = 0; i < word.size(); ++i) {
           for (int j = 0; j < 26; ++j) {
               if (keyboard[j] == word[i]) {
                   sum += abs(j - pre);
                   pre = j;
                   break;
               }
           }
       }
       return sum;
   }

   int calculateTime2(string keyboard, string word) {
       vector<int> keyIndices(26, -1);

       // 获取每一个键的索引
       for (int i = 0; i < keyboard.length(); i++)
           keyIndices[keyboard[i] - 'a'] = i;

       // 将上一个索引初始化为起始索引 0。
       int prev = 0;
       int result = 0;

       // 计算总次数。
       for (char &c : word) {
           // 将前一个索引到当前字母的索引的距离添加到结果中。
           result += abs(prev - keyIndices[c - 'a']);

           // 将上一个索引更新为下一个迭代的当前索引。
           prev = keyIndices[c - 'a'];
       }
       return result;
   }
};

golang 解法, 执行用时: 0 ms, 内存消耗: 2.2 MB, 提交时间: 2023-10-15 17:46:46

func calculateTime(keyboard string, word string) int {
   sum, pre := 0, 0 
   for i := 0; i < len(word); i++ {
       for j := 0; j < 26; j++ {
           if keyboard[j] == word[i] {
               sum += abs(j - pre) // 计算移动到当前字符的时间
               pre = j // 保存上一个位置
               break
           }
       }
   }
   return sum
}

func abs(x int) int {
   if x < 0 {
       return -1 * x
   }
   return x
}

上一题