Day16 LeetCode 237 238 292(JAVA版)

目录

1. 删除链表中的节点(LeetCode 231 题)

1.1题目

1.2思路

2. 除自身以外数组的乘积(LeetCode 238 题)

2.1题目

2.2思路

3. Nim 游戏(LeetCode 292题)

3.1题目

3.2思路


1. 删除链表中的节点(LeetCode 231 题)

1.1题目

1.2思路

这个题说是一个链表题,但是对链表操作的考察并不多。反而是个脑筋急转弯的题。

按照正常的思路大家一般都会去找头结点,但是没有头结点一是没了方向不知道怎么做。

其实题目给出说每个结点的值唯一。这个条件非常重要。如果唯一,那么完全可以把值轮流复制下去,然后删除尾结点即可模拟了删除中间结点的操作。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public void deleteNode(ListNode node) {
        while(node.next.next!=null){
            node.val = node.next.val;
            node = node.next;
        }
        node.val = node.next.val;
        node.next = null;
    }
}

2. 除自身以外数组的乘积(LeetCode 238 题)

2.1题目

 

 

2.2思路

本题的正常思路就是乘出来所有的数然后逐个做除法。不过官方给出了禁止使用除法。那么如何实现除了自身以外数字的乘法呢?

思路如下,就是比如求第i个元素的除他外其他元素的乘积,可以转化为[0,i-1]*[i+1,n]这样的乘积。

而对与第i+1个元素来说[0,i]*[i+2,n]这样左半边的元素就多乘一个[i]的值,右边少了一个[i+1]的值。

我们可以构建左乘和右乘的两个数组,然后对应位置相乘即可得到我们的最终数组。

同时为了降低空间复杂度,可以先将输出数组作为存储左乘的数组,而右乘的数组每次更新,直接求得最终答案,把他变为一个动态的值即可。

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int[] ans = new int[nums.length];
        int k=1;ans[0] = 1;
        for(int i =1;i<nums.length;i++){
            ans[i]=nums[i-1]*k;
            k = ans[i];
        }
        k = 1;
        int i =nums.length-1;
        while(i>=0){
            k = i==nums.length-1?k:k*nums[i+1];
            ans[i] = ans[i]*k;
            i--;
        }
        return ans;
    }
}

 

3. Nim 游戏(LeetCode 292题)

3.1题目

 

3.2思路

我觉得这个题是最难得一道题……但是能结出来代码量确实不大,但是需要思路。

博弈论问题……

https://blog.csdn.net/clover_hxy/article/details/53818624

class Solution {
    public boolean canWinNim(int n) {
        if(n<=3) return true;
        return (n&3)!=0;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值