按知识点刷题

Posted Coding With you.....

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了按知识点刷题相关的知识,希望对你有一定的参考价值。

一、链表

1.牛客剑指offer     剑指Offer_在线编程+题解_牛客题霸_牛客网

内容在博客上

2.一个网站   CS-Notes

剑指:

6. 交换链表中的相邻结点

思路:

递归:当节点.next不为空时,节点与next交换;下一个遍历的是节点.next.next

 tip:不递归直接遍历 

 while (pre.next != null && pre.next.next != null) 

7. 链表求和

思路:

将链表进行反转-这样可以直接next进行相加以及进位的保存,当遍历到其中一个链表为空时,另一个链表只考虑自己和进位之和的相加来更新节点的val

  • head保存当前已经计算的值,node是当前节点-new的时候值为进位后对10取余;
  • node的next指向head的next——head的next是计算的后几位,head是空   
  • 然后head.next=node就是head一直是保存已经计算的值 且第一个是空指针

tip:因为不能改变链表的原始结构,所以采用两个栈进行计算

8. 回文链表

思路:

  • 等于空返回false;等于1返回TRUE;其他情况:先计算链表长度,然后创建两个链表,
  • 后一个指针先走ceil(长度/2)步
  • 然后前一个指针和后一个指针同时走知道指针二为空,每一个值保存到一个链表中
  • 将其中一个链表反转看他两是否相等   空间复杂度是n

tip:返回时Listnode数组,所以数组中保存的是节点,其中每一个到长度后一定要使其指向空

  • 不需要计算长度,设置一个快指针和一个慢指针,当快指针走到结尾时慢指针走到了中间,其后面的是后一半部分
  • 将前半部分的最后一个的next指向空,后半部分从慢指针指向的列表反转
  • 如果两个链表的每一位都对等,那么就是回文的   否则不是

9. 分隔链表

题目描述:把链表分隔成 k 部分,每部分的长度都应该尽可能相同,排在前面的长度应该大于等于后面的。

思路:首先计算链表的长度,然后与k取整为后面每一组数量,取余+取整为第一组的数量

然后就是遍历链表:首先遍历取出第一组的来,然后每循环取整次,就保存到下一组

使用两层for循环就行

tip:不是将余数都放在第一个链表中,而是每一个数组中填1个,直到填完为止 这个超级棒哦

      组数确定,但是每一组里面的长度是在每次遍历的时候确定的

10. 链表元素按奇偶聚集

思路:加一个头指针,采用两个指针,一个指向奇数值的节点,一个指向偶数值的节点;奇数节点比偶数节点早一步,然后两个同步走;

当偶数节点遇到偶数的时候,如果奇数节点指向奇数,那么他两交换;如果奇数节点指向偶数,那么奇数继续向后走直到奇数才交换   当奇数到达最后为null时结束

 tip:官方的比较简单,因为已知的是奇偶表,所以1,3,5等位置为奇数,2,4,6为偶数,不需要去拿指针寻找,直接next=next.next就可以

6. 交换链表中的相邻结点

思路

递归当节点.next不为空时,节点与next交换;下一个遍历的是节点.next.next

tip:不递归直接遍历 

6. 交换链表中的相邻结点

思路

递归当节点.next不为空时,节点与next交换;下一个遍历的是节点.next.next

tip:不递归直接遍历 

leecode:

6. 交换链表中的相邻结点

思路

递归当节点.next不为空时,节点与next交换;下一个遍历的是节点.next.next

tip:不递归直接遍历 

6. 交换链表中的相邻结点

思路

递归当节点.next不为空时,节点与next交换;下一个遍历的是节点.next.next

tip:不递归直接遍历 

3.代码随想录代码随想录

  

二、数组

二分查找涉及的很多的边界条件,逻辑比较简单,但就是写不好。例如到底是 while(left < right) 还是 while(left <= right),到底是right = middle呢,还是要right = middle - 1呢?

写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。

第一种写法,我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right] ,区间的定义这就决定了二分法的代码应该如何写,因为定义target在[left, right]区间,

  • while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
  • if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1

第二种写法:如果说定义 target 是在一个在左闭右开的区间里,也就是[left, right)

  • while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
  • if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]

 1.代码随想录

6. 交换链表中的相邻结点

思路

递归当节点.next不为空时,节点与next交换;下一个遍历的是节点.next.next

tip:不递归直接遍历 

6. 交换链表中的相邻结点

思路

递归当节点.next不为空时,节点与next交换;下一个遍历的是节点.next.next

tip:不递归直接遍历 

6. 交换链表中的相邻结点

思路

递归当节点.next不为空时,节点与next交换;下一个遍历的是节点.next.next

tip:不递归直接遍历 

以上是关于按知识点刷题的主要内容,如果未能解决你的问题,请参考以下文章

ADT - Hash Table(散列表)

数据结构与算法—散列表

HashMaplru散列表

javase(数组链表散列表)

数据结构 散列表

十散列表