目录
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;
}
}