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"]
# 总结
电话号码的字母组合问题是一个典型的使用回溯算法解决的问题。通过这个问题的解法,我们可以更好地理解递归和回溯算法的工作原理及其应用方式。
热门推荐