输入单词需要的最少按键次数 I

文章讨论了如何计算在给定一个由不同字母组成的字符串中,按顺序输入最少的按键次数。提供了两种方法:一种是逐组累加按键次数,另一种是利用数学公式(n/8*(4k+k+1)+n%8*(k+1)),其中k=n/8。

题目链接

输入单词需要的最少按键次数 I

题目描述




注意点

  • 1 <= word.length <= 26
  • word 仅由小写英文字母组成
  • word 中的所有字母互不相同

解答思路

  • 因为word 中的所有字母互不相同,可以以任意8个字符为一组,第一组每个字符需要按键一次,第二组需要按键两次,以此类推…根据字符串长度将每组字符的按键次数累加起来
  • 第二种解法是数学思路,根据字符串的长度n可以计算出每个按键至少分配的字符数量k = n / 8,一样每8个字符为一组,那么这8k个字符需要按键的次数为8 * (1 + 2 + … + k) = 4k * (k + 1),剩下n % 8个字符需要按键的次数为(k + 1)次,也就是(n % 8) * (k + 1),所以总按键次数就为4k * (k + 1) + (n % 8)(k + 1) = (4k + n % 8)(k + 1)

代码

方法一:

class Solution {
    public int minimumPushes(String word) {
        int n = word.length();
        int res = 0;
        int i = 1;
        while (n / 8 != 0) {
            res += 8 * i;
            n -= 8;
            i++;
        }
        res += (n % 8) * i;
        return res;
    }
}

方法二:

class Solution {
    public int minimumPushes(String word) {
        int n = word.length();
        int k = n / 8;
        return (k * 4 + n % 8) * (k + 1);
    }
}

关键点

  • word 中的所有字母互不相同,所以word的最大长度为26
  • 推出数学公式的过程
第4题 H-小梦练习打字 描述 小梦在练习打字,他打开电脑上的记事本,准备输入一系列单词组成的集合,他想要知道如果想在记事本上显示过这个单词集合中所有的单词,则最少敲多少下键盘? 具体来讲,小梦只能使用键盘上的26个英文字母和退格符。在题干中,为了便于观察,我们使用 \b 表示退格符,输入后会删除记事本上最后一个字符。 例如,当前的单词集合是 {acoder,acdays,ac},则在键盘上依次输入acdays\b\b\b\bcoder 就可以完成在记事本上显示过 acoder,acdays,ac三个单词的目标,只要求在输入的过程中存在过这几个单词就算完成目标,没有先后顺序。 现在有n个单词,编号从1到n,小梦有m次查询,每次查询单词集合为l 到r时,要想在记事本上显示过所有单词,至少要敲几下键盘? 注意:记事本上显示某个单词指的是在某个时刻,记事本上仅显示该单词,不包括以子串的形式显示。敲一次退格符视为敲一下键盘。 输入 第一行包含两个正整数 n,m表示单词的数量、查询的次数。 接下来 n行,第i行包含一个字符串 s[i],表示仅有小写英文字母组成的单词。 最后输入m行,第 i 行包含两个正整数 l[i],r[i]表示一次查询。 输出 对于每一次查询,新起一行,输出一个整数,表示最少需要敲几次键盘。 提示 【样例解释】 对于第一次查询,在键盘上依次输入:acdays\b\b\b\bcoder,共敲击15次。 对于第二次查询,在键盘上依次输入:ac,共敲击2次。 【数据范围】 对于100%的评测用例,1<=n,m<=10^5,1<=l[i],r[i]<=n 除此之外,保证单个测试文件中出现的小写字母s[i]数量之和不超过10^6。 时空限制 1000ms/512MB 题目样例 输入 #1 3 2 accoder acdays ac 1 3 3 3 输出 #1 15 2
08-11
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值