xdm,太狗血了,面試居然碰到了前女友,而且還是最後一面的面試官,真的人都麻了,這放在整個面試界也是相當的炸裂......
這場面試,註定不同尋常。
讓人好笑的是,面試結束時,前女友面無表情地說:「面試結果我們會信件通知你。有什麽問題,我們會信件或電話聯系。」然後頓了頓,補充了一句:「不過,你的手機號,我已經拉黑了。」
論壇上的瓜友們對這個故事反應熱烈,評論區炸了鍋。
有人調侃說,「想代入女主狠狠拷打樓主」。
也有人開玩笑,「這放在整個面試界都是相當炸裂的」。
更有意思的是,有瓜友開始腦補後續劇情,「入職】後悔】復合,劇情我已經想好了」。
最後,居然還有人線上催更!叫樓主別斷更了。
樓主也是回復,會更新後續,簡直是像在網上追劇一樣樣的,哈哈。大家想吃後續的瓜也可以去踩一下樓主的貼子。
下面是今日演算法題
今日演算法題,來自LeetCode的第17題:電話號碼的字母組合,下面是我的演算法思路及實作,讓我們來看看吧。
# 演算法題目
給定一個僅包含數位 2-9 的字串,返回所有它能代表的字母組合。數位到字母的對映方式如下(就像電話按鍵一樣):2 - abc、3 - def、4 - ghi、5 - jkl、6 - mno、7 - pqrs、8 - tuv、9 - wxyz。註意,1 不對應任何字母。
# 演算法思路
初始化對映:
首先建立一個陣列或哈希表來儲存每個數位到其對應字母的對映。
遞迴函式定義:
定義一個遞迴函式,它接受當前的字串(初始為空)、數位字串和當前數位字串的索引。
函式的目的是在當前字串後添加所有可能的字母,並在達到數位字串末尾時將完成的字串添加到結果中。
回溯遍歷:
對於數位字串中的每個數位,獲取其對應的所有可能字母。
對於這些字母中的每一個,添加到當前字串,並遞迴呼叫函式,索引加一。
遞迴完成後,返回上一層(回溯),嘗試其他可能的字母。
收集結果:
當遍歷完所有數位字串時,將當前累積的字串添加到結果列表中。
# 程式碼實作
C語言實作
首先,我們需要定義一個對映表來將數位對映到相應的字母,然後使用回溯法生成所有可能的組合。我們還需要定義一個輔助函式來增加新的組合到結果集中。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* letterMap[10] = {
"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"
};
voidbacktrack(char **result, int *returnSize, char *current, int currentSize, char *digits, int index, int length){
if (index == length) {
current[currentSize] = '\0'; // End current string
result[*returnSize] = (char*)malloc(sizeof(char) * (currentSize + 1));
strcpy(result[*returnSize], current);
(*returnSize)++;
return;
}
char *letters = letterMap[digits[index] - '0'];
for (int i = 0; letters[i] != '\0'; i++) {
current[currentSize] = letters[i];
backtrack(result, returnSize, current, currentSize + 1, digits, index + 1, length);
}
}
char **letterCombinations(char *digits, int *returnSize){
int length = strlen(digits);
if (length == 0) {
*returnSize = 0;
returnNULL;
}
int maxCombinations = 1;
for (int i = 0; i < length; i++) {
if (digits[i] == '7' || digits[i] == '9') maxCombinations *= 4; // 'pqrs' or 'wxyz'
else maxCombinations *= 3;
}
char **result = (char**)malloc(sizeof(char*) * maxCombinations);
char *current = (char*)malloc(sizeof(char) * (length + 1)); // +1 for '\0'
*returnSize = 0;
backtrack(result, returnSize, current, 0, digits, 0, length);
free(current);
return result;
}
intmain(){
char digits[] = "23";
int returnSize;
char **combinations = letterCombinations(digits, &returnSize);
for (int i = 0; i < returnSize; i++) {
printf("%s\n", combinations[i]);
free(combinations[i]); // Free each string
}
free(combinations); // Free the array of strings
return0;
}
Java實作
import java.util.ArrayList;
import java.util.List;
public class Solution {
privateString[] letterMap = {
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs",// 7
"tuv", // 8
"wxyz"// 9
};
public List<String> letterCombinations(String digits) {
List<String> results = new ArrayList<>();
if (digits == null || digits.length() == 0) {
return results;
}
backtrack(results, digits, "", 0);
return results;
}
privatevoid backtrack(List<String> results, String digits, String current, int index) {
if (index == digits.length()) {
results.add(current);
return;
}
String letters = letterMap[digits.charAt(index) - '0'];
for (char letter : letters.toCharArray()) {
backtrack(results, digits, current + letter, index + 1);
}
}
}
Python實作
defletter_combinations(digits):
ifnot digits:
return []
letter_map = ["", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
results = []
defbacktrack(index, current):
if index == len(digits):
results.append(current)
return
letters = letter_map[int(digits[index])]
for letter in letters:
backtrack(index + 1, current + letter)
backtrack(0, "")
return results
# 演算法解析
這種方法利用了遞迴和回溯演算法的優勢,能夠高效地解決問題。每一步選擇一個數位對應的所有可能字母,然後遞迴地處理下一個數位,直到處理完所有輸入的數位。
# 範例和測試
以輸入字串 "23" 為例:
digits = "23"
print(letter_combinations(digits))
輸出:
["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]
# 總結
電話號碼的字母組合問題是一個典型的使用回溯演算法解決的問題。透過這個問題的解法,我們可以更好地理解遞迴和回溯演算法的工作原理及其套用方式。
熱門推薦