3妹:2哥,新年好鴨~
2哥 : 新年好,3妹這么早啊
3妹:是啊,新年第一天要起早,這樣就可以起早一整年
2哥 :得,我還不了解你,每天曬到日上三竿
3妹:嘿嘿嘿嘿,一年是有300多天起的比較晚~
2哥:3妹,過完年什么時候回來啊
3妹:最少也要初七吧,好不容易回家一趟多陪陪父母。
2哥:好吧,回家也也要記得每天刷題啊,今天有一道“最少”的題目, 讓我們先做一下吧~
題目:
給你一個字符串 word,由 不同 小寫英文字母組成。
電話鍵盤上的按鍵與 不同 小寫英文字母集合相映射,可以通過按壓按鍵來組成單詞。例如,按鍵 2 對應 ["a","b","c"],我們需要按一次鍵來輸入 "a",按兩次鍵來輸入 "b",按三次鍵來輸入 "c"。
現在允許你將編號為 2 到 9 的按鍵重新映射到 不同 字母集合。每個按鍵可以映射到 任意數量 的字母,但每個字母 必須 恰好 映射到 一個 按鍵上。你需要找到輸入字符串 word 所需的 最少 按鍵次數。
返回重新映射按鍵后輸入 word 所需的 最少 按鍵次數。
下面給出了一種電話鍵盤上字母到按鍵的映射作為示例。注意 1,*,# 和 0 不 對應任何字母。
示例 1:
輸入:word = "abcde"
輸出:5
解釋:圖片中給出的重新映射方案的輸入成本最小。
"a" -> 在按鍵 2 上按一次
"b" -> 在按鍵 3 上按一次
"c" -> 在按鍵 4 上按一次
"d" -> 在按鍵 5 上按一次
"e" -> 在按鍵 6 上按一次
總成本為 1 + 1 + 1 + 1 + 1 = 5 。
可以證明不存在其他成本更低的映射方案。
示例 2:
輸入:word = "xycdefghij"
輸出:12
解釋:圖片中給出的重新映射方案的輸入成本最小。
"x" -> 在按鍵 2 上按一次
"y" -> 在按鍵 2 上按兩次
"c" -> 在按鍵 3 上按一次
"d" -> 在按鍵 3 上按兩次
"e" -> 在按鍵 4 上按一次
"f" -> 在按鍵 5 上按一次
"g" -> 在按鍵 6 上按一次
"h" -> 在按鍵 7 上按一次
"i" -> 在按鍵 8 上按一次
"j" -> 在按鍵 9 上按一次
總成本為 1 + 2 + 1 + 2 + 1 + 1 + 1 + 1 + 1 + 1 = 12 。
可以證明不存在其他成本更低的映射方案。
提示:
1 <= word.length <= 26
word 僅由小寫英文字母組成。
word 中的所有字母互不相同。
思路:
設 nums\textit{nums}nums 的異或和為 sss。
由于各個字母互不相同,所以均勻分配到這 8 個按鍵。
設字符串長度為 n,k=?n/8?,那么先分配給每個按鍵 k 個字母,總按鍵次數為
8?(1+2+?+k)=4k(k+1)
剩余的 n?mod?8個字母需要按 k+1次。
所以答案為
4k(k+1)+(n?mod?8)(k+1)=(4k+n?mod?8)(k+1)
java代碼:
class Solution {
public int minimumPushes(String word) {
int n = word.length();
int k = n / 8;
return (k * 4 + n % 8) * (k + 1);
}
}