Datawhole第十六天打卡

第一题:删除链表中的节点

请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。

现有一个链表 -- 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.

说明:

链表至少包含两个节点。

链表中所有节点的值都是唯一的。

给定的节点为非末尾节点并且一定是链表中的一个有效节点。

不要从你的函数中返回任何结果。

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;

    }

}

第二题:除自身以外数组的乘积

给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。

示例:

输入: [1,2,3,4]输出: [24,12,8,6]

说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。

进阶

你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)

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;

    }

}

第三题:Nim 游戏

你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。

你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。

示例:

输入:4输出:false解释: 如果堆中有4块石头,那么你永远不会赢得比赛;    因为无论你拿走1块、2块 还是3块石头,最后一块石头总是会被你的朋友拿走。

public class Solution

{

    public bool CanWinNim(int n)

    {

        return (n % 4 != 0);

    }

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容