LeetCode50题(17天)-Day16
237 删除链表中的节点
- 题号:237
- 难度:简单
- https://leetcode-cn.com/problems/delete-node-in-a-linked-list/
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
现有一个链表 – head = [4,5,1,9],它可以表示为:
示例 1:
输入: head = [4,5,1,9], node = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:
输入: head = [4,5,1,9], node = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
说明:
- 链表至少包含两个节点。
- 链表中所有节点的值都是唯一的。
- 给定的节点为非末尾节点并且一定是链表中的一个有效节点。
- 不要从你的函数中返回任何结果。
实现
思路: 这道题没有给出链表的头节点,而是直接给出要删除的节点,让我们进行原地删除。我们对于该节点的前一个节点一无所知,所以无法直接执行删除操作。因此,我们将要删除节点的 next 节点的值赋值给要删除的节点,转而去删除 next 节点,从而达成目的。
- 状态:通过
- 41 / 41 个通过测试用例
- 执行用时: 120 ms, 在所有 C# 提交中击败了 99.55% 的用户
- 内存消耗: 24.4 MB, 在所有 C# 提交中击败了 5.88% 的用户
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution
{
public void DeleteNode(ListNode node)
{
ListNode temp = node.next;
while (temp != null)
{
node.val = temp.val;
temp = temp.next;
if (temp != null)
{
node = node.next;
}
}
node.next = null;
}
}
238 除自身以外数组的乘积
- 题号:238
- 难度:中等
- https://leetcode-cn.com/problems/product-of-array-except-self/
给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
示例:
输入: [1,2,3,4]
输出: [24,12,8,6]
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
进阶:
你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)
实现
思路:乘积 = 当前数左边的乘积 * 当前数右边的乘积
[1, 2, 3, 4]
左边的乘积 [1, 1, 2, 6]
右边的乘积 [24,12,4, 1]
结果 = 左*右 [24,12,8, 6]
- 状态:通过
- 17 / 17 个通过测试用例
- 执行用时: 304 ms, 在所有 C# 提交中击败了 100.00% 的用户
- 内存消耗: 34.6 MB, 在所有 C# 提交中击败了 100.00% 的用户
public class Solution
{
public int[] ProductExceptSelf(int[] nums)
{
int len = nums.Length;
int[] output1 = new int[len];//正向乘积
int[] output2 = new int[len];//反向乘积
output1[0] = 1;
output2[len - 1] = 1;
for (int i = 1; i < len; i++)
{
output1[i] = output1[i - 1]*nums[i - 1];
output2[len - i - 1] = output2[len - i]*nums[len - i];
}
for (int i = 0; i < len; i++)
{
output1[i] *= output2[i];
}
return output1;
}
}
292 Nim游戏
- 题号:292
- 难度:简单
- https://leetcode-cn.com/problems/nim-game/
你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。
你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。
示例:
输入: 4
输出: false
解释: 如果堆中有 4 块石头,那么你永远不会赢得比赛;
因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块石头总是会被你的朋友拿走。
实现
思路:每一回合都必须拿石子,所以当到谁的回合还剩下4个石子,那么谁就输了。
- [1,3]先手赢
- [4]后手赢
- [5,7]先手赢,因为你可以使到对方回合时是剩下4个石子
- [8]后手赢,此时对方可以使在你的回合时剩下4个石子
- 以次类推可以发现当n为4的倍数时先手总会输
C# 实现
- 状态:通过
- 60 / 60 个通过测试用例
- 执行用时: 56 ms, 在所有 C# 提交中击败了 82.41% 的用户
- 内存消耗: 13.6 MB, 在所有 C# 提交中击败了 5.17% 的用户
public class Solution
{
public bool CanWinNim(int n)
{
return (n % 4 != 0);
}
}
Python 实现
- 执行结果:通过
- 执行用时:36 ms, 在所有 Python3 提交中击败了 68.15% 的用户
- 内存消耗:13.7 MB, 在所有 Python3 提交中击败了 10.00% 的用户
class Solution:
def canWinNim(self, n: int) -> bool:
return n%4 != 0