3014
题目链接:3014. 输入单词需要的最少按键次数 I(简单)
算法原理:
解法:贪心
时间复杂度O(N)
0ms击败100.00%
由于 word 中每个小写字母各不相同,那么我们就可以优先把 word 中有的字母放到各个按键的最前面,这样就能保证只用一次就按出来,如果这 8 个挤不开了,就放到往各个按键的第二个位置上分配,以此类推,这样我们使用一个 while 循环就可以轻松解决了
Java代码:
java
class Solution {
//3014. 输入单词需要的最少按键次数 I
public int minimumPushes(String word) {
int n=word.length(),cnt=0;
while(n>0){
cnt+=n;
n-=8;
}
return cnt;
}
}
3016
题目链接:3016. 输入单词需要的最少按键次数 II(中等)
算法原理:
解法:贪心
时间复杂度O(N)
10ms击败90.48%
与上题类似,唯一不同的就是 word 中可能出现重复的小写字母了,那么如何解决呢??
其实也还是贪心的思想,很简单
直接把 word 字符串中各个字符出现的频率统计出来,排好序之后,我们把出现次数最多的放在各个按键的最前面即可,然后依次类推即可,这样即可保证用最少的次数按到所有需要按的字符
由于小写字母只有 26 个,因此我们可以借助数组实现,经过排序后再逆序遍历一遍就行了~~
Java代码:
java
class Solution {
//3016. 输入单词需要的最少按键次数 II
public int minimumPushes(String word) {
int[] hash=new int[26];
for(char c:word.toCharArray()) hash[c-'a']++;
Arrays.sort(hash);
int cnt=0;
for(int i=25;i>=0;i--){
if(i>17) cnt+=hash[i];
else if(i>9) cnt+=2*hash[i];
else if(i>1) cnt+=3*hash[i];
else cnt+=4*hash[i];
}
return cnt;
}
}