Re: [闲聊] 每日leetcode

楼主: sustainer123 (caster)   2024-08-06 09:39:30
※ 引述《JerryChungYC (JerryChung)》之铭言:
: https://leetcode.com/problems/minimum-number-of-pushes-to-type-word-ii
: 3016. Minimum Number of Pushes to Type Word II
: 给一个字串 word
: 电话按键映射小写英文字母集合 透过按的次数获得字母
: 如 2 映射 ['a', 'b', 'c'] 按 1 次得到 a 按 2 次得到 b 按 3 次得到 c
: 现在将按键 2~9 重新对应到不同字母集合 每个键可以映射到任意数量的字母
: 找出输入字串所需的最少按键次数
: 注意 1, *, #, 0 不映射到任何字母
: Example 1:
: Input: word = "abcde"
: Output: 5
: Explanation: "a" ~ "e" 分别对应 key 2 ~ 6
: 合计 1 + 1 + 1 + 1 + 1 = 5
: Example 2:
: Input: word = "xyzxyzxyzxyz"
: Output: 12
: Explanation: "x" ~ "z" 分别对应 key 2 ~ 4
: 合计 1 * 4 + 1 * 4 + 1 * 4 = 12
: 如范例 2 的图显示 key 可以不对应到任何字母
: Example 3:
: Input: word = "aabbccddeeffgghhiiiiii"
: Output: 24
: Explanation: "a" ~ "g" 分别对应 key 2 ~ 8
: "h" 对应 two pushes on key 9
: "i" 对应 one push on key 9
: 合计 1 * 2 * 7 + 2 * 2 + 6 * 1 = 24
: 思路:获得每个字母出现次数后排序由大到小
: 前8个放在 one push 9~16 放在 two pushes 依此类推 就能得到最少次数
: Python Code:
: class Solution:
: def minimumPushes(self, word: str) -> int:
: return sum(v * (i // 8) for i, (_, v) in enumerate(Counter(word).most_
: common(), 8))
: Counter(word): 取得每个字母的出现次数
: most_common(n = int | None = None): 由大到小进行排序 没给 n 则回传所有内容
: enumerate(iterable, start: int): 获得当前 index 与值 这边从 8 开始计算
: v * (i // 8): v 为出现次数, i 为 index, i // 8 决定放在 one push or two pushes
思路:
记出现次数 排序 乘起来
不过我写得有够丑 哀
Python Code:
class Solution:
def minimumPushes(self, word: str) -> int:
record = defaultdict(int)
for c in word:
record[c] += 1
times = [v for v in record.values()]
times.sort(reverse = True)
count = 0
result = 0
for t in times:
if count < 8:
result += 1*t
elif count < 16:
result += 2*t
elif count <24:
result += 3*t
else:
result += 4*t
count += 1
return result
作者: JerryChungYC (JerryChung)   2024-08-06 09:43:00
大师
楼主: sustainer123 (caster)   2024-08-06 09:43:00
你是一行大师
作者: JIWP (JIWP)   2024-08-06 09:46:00
我好崇拜你

Links booklink

Contact Us: admin [ a t ] ucptt.com