A.每日一题:输入单词需要的最少按键次数 Ⅰ+Ⅱ

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;
    }
}
相关推荐
丘山望岳9 小时前
单调栈和单调队列
数据结构
Fuyo_11199 小时前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法
Sarvartha9 小时前
Date、LocalDate、LocalTime、LocalDateTime、DateTimeFormatter类
java
jktantan9 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
阿俊-全栈开发10 小时前
LikeShop 多商户 Java 版商城微服务模块拆分与部署架构演进实践
java·微服务·架构·likeshop开源商城·多商户源码
揽星河..10 小时前
【C语言】猜数字游戏
c语言·算法·游戏
Wang's Blog10 小时前
Java 项目实战:交友项目 - 联系人列表
java·开发语言·交友
我命由我1234510 小时前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
frjc10 小时前
分布式服务拆分实战指南:从底层逻辑到面试话术
微服务·面试·职场和发展
LabVIEW开发10 小时前
CTM-3 红外测温仪 + LabVIEW 温度怎么测?
算法·labview·测试·labview程序