Every day a Leetcode
解法1:统计
统计字符串 word 的小写字母个数和 1、#、*、0 的个数。
将小写字母均匀地分配到 8 个按键上,模拟即可。
代码:
/*
* @lc app=leetcode.cn id=3014 lang=cpp
*
* [3014] 输入单词需要的最少按键次数 I
*/
// @lc code=start
class Solution
{
public:
int minimumPushes(string word)
{
// 特判
if (word.empty())
return 0;
const string special = "1*#0";
int count_sp = 0, count_alpha = 0;
for (char &c : word)
{
if (special.find(c) != string::npos)
count_sp++;
else
count_alpha++;
}
int ans = 0, x = 1;
while (count_alpha >= 8)
{
ans += 8 * x;
x++;
count_alpha -= 8;
}
ans += count_alpha * x + count_sp;
return ans;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n),其中 n 是字符串 s 的长度。
空间复杂度:O(1)。
解法2:数学
题目里说了字符串 s 中只要小写字母,所以不用统计 1、#、*、0 这 4 个特殊字符的出现次数。
代码:
// 数学
class Solution
{
public:
int minimumPushes(string word)
{
// 特判
if (word.empty())
return 0;
int n = word.length();
int k = n / 8;
return (k * 4 + n % 8) * (k + 1);
}
};
结果:
复杂度分析:
时间复杂度:O(1)。
空间复杂度:O(1)。