输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
提示:
sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
进阶:你能尝试使用一趟扫描实现吗?
python3
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
# 方法1: 追随指针
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
# 在最前添加一个节点,用于接 head
dummy = ListNode(0, head)
# 快指针: right, 慢指针: left
left, right = dummy, head
# 1. 先让 right 快指针 走 n 步
for i in range(n):
right = right.next
# 2. 再 慢指针,快指针 一起走
# 直到 快指针走到终点(注意,走到末节点就可以了)
while right != None:
right = right.next
left = left.next
# 跳过中间的节点(即删除倒数第n个节点)
left.next = left.next.next
# 注意:返回的是 dummy.next
return dummy.next
2. 有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
提示:
public class Solution {
public bool IsValid(string s) {
// key: 右括号 value: 左括号
Dictionary<char, char> dic = new Dictionary<char, char>()
{
{ ')', '(' },
{ '}', '{' },
{ ']', '[' }
};
Stack<char> stack = new Stack<char>();
//Queue<char> stack = new Queue<char>();
foreach (char ch in s)
{
if (dic.ContainsKey(ch))
{
// 是 右括号
if (stack.Count == 0 || stack.Peek() != dic[ch])
{
// 栈为空 或 栈顶字符 不匹配此右括号
return false;
}
// 弹出栈中匹配的左括号
stack.Pop();
}
else
{
// 压入 左括号
stack.Push(ch);
}
}
// 最后为空则说明括号完全匹配,有效括号
return stack.Count == 0;
}
}
3. 整数反转
x
,返回将 x
中的数字部分反转后的结果。,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
public class Solution {
public int Reverse(int num) {
int rev = 0;
while (num != 0)
{
// 取个位弹出
int pop = num % 10;
// 降位: 百位变十位
num = num / 10;
// 防止溢出
if (rev > int.MaxValue / 10 || (rev == int.MaxValue / 10 && pop > 7)) return 0;
if (rev < int.MinValue / 10 || (rev == int.MinValue / 10 && pop < -8)) return 0;
rev = rev * 10 + pop;
}
return rev;
}
}
Q&A 补充 参考 感谢帮助!