Every day a Leetcode
题目来源:3014. 输入单词需要的最少按键次数 I
解法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++;elsecount_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)。