Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
17. 电话号码的字母组合
一、题目描述:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入: digits = "23"
输出: ["ad","ae","af","bd","be","bf","cd","ce","cf"]
二、思路分析: 回溯
- 已经做出的选择(记录在 StringBuilder 中)
- 结束条件(字符串遍历结束)
- 可以做出的选择(当前数字对应的字母组合)
三、AC 代码:
class Solution {
List<String> ans;
Map<Character, String> map;
public List<String> letterCombinations(String digits) {
if (digits == null || digits.length() == 0) {
return new ArrayList<>();
}
ans = new ArrayList<>();
map = new HashMap<>();
map.put('2', "abc");
map.put('3', "def");
map.put('4', "ghi");
map.put('5', "jkl");
map.put('6', "mno");
map.put('7', "pqrs");
map.put('8', "tuv");
map.put('9', "wxyz");
dfs(digits, 0, new StringBuilder());
return ans;
}
void dfs(String str, int index, StringBuilder sb) {
if (index == str.length()) {
ans.add(sb.toString());
return;
}
String value = map.get(str.charAt(index));
for (int i = 0; i < value.length(); i++) {
sb.append(value.charAt(i));
dfs(str, index + 1, sb);
sb.deleteCharAt(sb.length() - 1);
}
}
}
19. 删除链表的倒数第 N 个结点
一、题目描述:
给你一个链表,删除链表的倒数第 n **个结点,并且返回链表的头结点。
输入: head = [1,2,3,4,5], n = 2
输出: [1,2,3,5]
二、思路分析:
链表的 index 从 0 开始的, 链表的长度为 len,
删除倒数第 n 个节点, 也就是 正数第 len - n 个节点
快慢指针, 快指针先移动 n 步, 指向 第 n 个节点 快慢指针一起移动, 当快指针移动到末尾时,移动了 len - n 步
此时 慢指针 移动 len - n 步, 刚好指在 倒数第n个节点上面
所以添加一个前置节点 pre, 当快指针到末尾时, pre指向 倒数第n 个节点的前置节点,方便删除的操作
三、AC 代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode pre = new ListNode(-1);
pre.next = head;
ListNode ans = pre;
ListNode cur = head;
while(n != 0){
cur = cur.next;
n--;
}
while(cur != null){
cur = cur.next;
pre = pre.next;
}
pre.next = pre.next.next;
return ans.next;
}
}