🔥 LeetCode 热题 HOT 100: 17 && 19

76 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

17. 电话号码的字母组合

一、题目描述:

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

image.png

示例 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 **个结点,并且返回链表的头结点。

image.png

输入: 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;
    }
}