Leetcode刷题
主要语言 python js java吧
草莓味的狮子座leo
这个作者很懒,什么都没留下…
展开
-
关于链表刷题
反转链表ListNode prev = null;while(curr!=null){ ListNode temp = curr.next; curr.next = prev; prev = curr; curr = temp;}链表在指定区间内反转(部分反转)判断链表是否有环快慢指针while(fast!=null || fast.next !=null){ fast = fast.next.next; slow = slow.next; if(fast == .原创 2021-06-29 11:24:37 · 153 阅读 · 0 评论 -
二叉树遍历
单表sqlDISTINCT 返回唯一不同的值select DISTINCT 字段1,...,字段n from 表where 过滤条件group by 分组字段having 过滤order by 排序字段limit n执行顺序:from、 where 、groupby、having、select、DISTINCT 、orderby、limit...原创 2021-06-06 15:53:15 · 109 阅读 · 2 评论 -
判断回文(字符串、链表)
题1:判断回文解题:双指针定义左右两个指针,同个指针同时向中间移动,如果两个指针指向的元素不一样则返回false public boolean judge (String str) { // write code here if(str.length()<2){ return true; } int left = 0; int right = str.length()-1;原创 2021-06-02 20:05:16 · 138 阅读 · 0 评论 -
容器盛水问题
题1:盛最多水的容器解题:双指针初始两个左右指针,可容纳水量min(左指针,右指针)*指针间距S(i, j) = min(h[i], h[j]) × (j - i)移动数字较小的指针,min(h[i],h[j])可能变大public class Solution { public int maxArea(int[] height) { int left = 0; int right = height.length-1; int vomumn = 0; while(原创 2021-06-02 19:15:09 · 285 阅读 · 0 评论 -
java排序算法
1.排序算法原理:寻找到一个base,将小于base的值放左边,大于base的值放右边默认数组的第一个元素为base数据,即base = arr[0]设置两个变量low,high,初始化low=0;high=arr.length-1从后面往前搜索,high–,直至找到第一个小于base的元素arr[high],即arr[low]=arr[high]然后从前面开始搜索,low++,找到第一个大于base的元素arr[low],将arr[high]=arr[low]直至low=high,该位置原创 2021-06-01 15:29:21 · 107 阅读 · 1 评论 -
2021-05-31
预备知识字符串数组->字符串// 定义一个str字符串数组String[] str = {"asd","qwe","ere"};// 循环遍历StringBuffer sb =new StringBuffer();for(int i = 0; i < str.length; i++){ sb.appeng(str[i]);}// 返回字符对象sb.toString();字符数组->字符串// 字符数组char[] data = {'a','s','e'.原创 2021-05-31 12:22:03 · 88 阅读 · 0 评论 -
删除链表的倒数第n个节点
链表中倒数第K个节点解题思路:双指针 找到倒数第K个节点记录要删除节点的前一个节点 public ListNode removeNthFromEnd (ListNode head, int n) { // write code here if(head ==null){ return null; } ListNode fast = head; ListNode slow = head;.原创 2021-05-31 10:57:50 · 70 阅读 · 0 评论 -
删除有序链表中重复出现的元素
leetcode83解题思路:Map记录每个元素出现的次数public class Solution { /** * * @param head ListNode类 * @return ListNode类 */ public ListNode deleteDuplicates (ListNode head) { // write code here // 新建数组链表 ArrayList&.原创 2021-05-30 14:46:14 · 143 阅读 · 0 评论 -
链表中的节点每k个一组翻转
leetcode25递归:翻转第一组后,以第二组的开头为头节点找到从head开始的第K个节点,记为tail翻转head到tail的前一个节点,返回的头节点记为newHead以tail为头节点,递归每一次递归结束后,将head.next= 下一步翻转得到的newHead public ListNode reverseKGroup (ListNode head, int k) { // 先判断空指针 if(head ==null || head.next ==null){ .原创 2021-05-28 10:58:44 · 142 阅读 · 0 评论 -
链表中倒数第k个结点
1. 双指针第一个指针先移动K步,第二个指针从头开始移动当第一个指针移动至尾部,返回第二个指针即可注意:需要先判断是否空指针2. 栈思路:将原链表的节点全部入栈,然后取出栈的最上面的K个节点,出栈的节点形成新的链表ListNode newNode = stack.pop()while(--k>0){ ListNode temp = stack.pop() temp.next = newNode ; newNode = temp }return newNode...原创 2021-05-27 10:33:03 · 89 阅读 · 0 评论 -
合并两个有序数组
解法1:直接合并后排序nums1[m:]=nums2nums1.sort()解法2:双指针归并排序详解实现思路:从nums1和num2的尾部往头部开始遍历,每次取两者中较大元素放入num1的最后面len1 = m-1 // 开始索引len2 = n-1tail = m+n-1 // num1末尾while len1>=0 or len2 >=0: if num1[len1]>num2[len2]: num1[len]=num1[len1] len1.原创 2021-05-27 10:03:53 · 107 阅读 · 0 评论 -
使用两个栈实现一个队列
博客1博客2预备知识栈是先进后出,在栈顶进出元素队列是先进先出,队尾入队,队头出队入队:元素直接入栈1出队:先将栈1的元素依次出栈插入栈2,然后栈2出栈# -*- coding:utf-8 -*-class Solution: def __init__(self): self.stack1 = [] self.stack2 = [] def push(self, node): self.stack1.ap原创 2021-05-27 09:17:16 · 109 阅读 · 0 评论 -
链表中环的问题
1. 链表中是否有环leetcode141思路:设置快慢指针,fast和low,两者都从链表头出发,快指针每次走两步,慢指针每次走一步,若存在环,则快慢指针会在某个链表节点相遇if not head or not head.next: return False// 定义快慢指针初始位置不一样,是因为循环条件先于循环体// 如定义一样的初始位置,则需要使用do while循环slow = headfast = head.nextwhile slow!=fast:// 当链表中不存在环时,快原创 2021-05-26 18:08:38 · 242 阅读 · 0 评论 -
leetcode169:多数元素
剑指offer391. 解法1class Solution: def majorityElement(self, nums: List[int]) -> int: count = collections.Counter(nums) return max(count.keys(),key = count.get)2. 解法2摩尔投票法:每次从序列里选择两个不相同的数字抵消掉,最后只剩下相同的数字,就是出现次数大于总数一半的那个。摩尔算法详解public clas.原创 2021-05-26 11:42:09 · 83 阅读 · 0 评论 -
最长回文子串
leetcode-51.中心扩散法枚举所有字串的中心位置(循环遍历)字串长度为奇数(一个字符);偶数(2个字符)以当前位置字符为中心往两边扩散最长回文子串五种解法class Solution:// 回文串的中心位置 def expandAroundCenter(self, s, left, right): while left >= 0 and right < len(s) and s[left] == s[right]: .原创 2021-05-26 11:07:01 · 95 阅读 · 0 评论 -
二分查找算法
二分查找要求顺序存储结构。1. 二分查找的框架递归def BinarySearch(arr,left,right,target): if left < = right: mid = (left+right) //2 // mid = int(1+(r-l)/2) if arr[mid] == x: return mid // 若元素小于mid,只需要比较左边区域 elif arr[mid]>target: right = mid-1 return.原创 2021-05-26 09:03:27 · 77 阅读 · 0 评论 -
无重复字符的最长子串
剑指offer解题思路:滑动窗口使用hash表存储重复字符的位置key-value不断移动end指针,判断当前字符是否存在于hash表如果存在,将start指针移动至重复位置+1更新当前字符最新位置为end指针位置max_len = max(max_len,end - start+1)class Solution: def lengthOfLongestSubstring(self, s: str) -> int: if len(s) <=1: .原创 2021-05-23 13:28:13 · 81 阅读 · 0 评论 -
路径问题(动态规划)
不同路径 leetcode62解题思路:每一个格子都是由向上和向左的格子决定的设一个二维数组dp[m][n],m为横坐标,n为纵坐标第一行dp[m][0],第一列dp[0][n],由于都处于边界,因此路径数只能为1dp[i][j]是到达(i,j)位置的不同路径数目 dp[i][j] = dp[i - 1][j] + dp[i][j - 1]class Solution{ public int uniquePaths(int m,int n){ if(m==1 || n==1) re原创 2021-05-21 10:28:29 · 355 阅读 · 0 评论 -
美团测开
1.大文件中数AABB的数目2. 判断链表是否有环3.两数之和原创 2021-04-06 17:09:58 · 83 阅读 · 0 评论 -
shopee2021秋招笔试
1.(leetcode13)给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。解题思路使用字典存储罗马字符-数字{key:value}从左开始遍历每个罗马字符,若左边大,则相加;若左边小,则相减若罗马字符长度为1,即单个字符,则直接输出key对应的value值代码实现class Solution: def romanToInt(self , s ): dic ={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500原创 2021-04-06 10:39:41 · 329 阅读 · 0 评论 -
单链表的基本操作
- 插入- 删除单链表的建立原创 2021-03-10 11:43:42 · 57 阅读 · 0 评论 -
206.反转链表
方法1:迭代思想:将当前节点curr的指针指向前一个节点prev前一个节点prev指向当前节点curr,即prev = curr最后 curr =curr.next 指向下一个节点方法二:递归递归的终止条件:head =null 或 head.next =nullhead.next.next = headhead.next =nullif head == None or head.next ==None: return head// curr 是链表的最后一个节点cu.原创 2021-03-10 10:53:46 · 222 阅读 · 0 评论 -
148.排序链表
时间复杂度为O(nlogn)的排序算法:归并排序、堆排序、快速排序最适合链表的是归并排序1.自顶向上归并排序分治算法找到链表的中点,以中点为界,拆分链表为两个子链表。使用快慢指针的方法寻找链表的中点,快指针移动step为2,慢指针移动step为1,当快指针到达链表末尾时,慢指针指向的链表节点则为链表的中点对两个子链表分别排序将排序后的子链表合并,得到完整的排序后链表// 找到中点,排序// 递归实现,终止条件是 链表为空或只含有1个节点21题:合并两个有序链表方法一:递归原创 2021-03-10 08:58:35 · 111 阅读 · 0 评论 -
147。对链表进行插入排序
对链表进行插入排序判断链表是否为空创建一个哑节点dummyHead,令dummyHead.next=head设置虚拟头节点是因为元素可能插入到链表头,为了和其他位置操作一致lastSorted为链表已排序部分最后一个节点,初始值为lastSorted=headcurr是待插入的元素,初始值curr=head.next比较lastSorted和curr的节点值若lastSorted.val < = curr.val,说明curr应该位于lastSorted之后,将lastS原创 2021-03-09 11:06:38 · 62 阅读 · 0 评论 -
169.多数元素
哈希表使用哈希表HashMap来存储每个元素以及其出现的次数,键表示元素,值表示出现的次数Collections容器数据类型count = Collections.Count() //Count()提供了哈希对象的计数功能return max(nums.keys(),key = count.get) // 返回次数最多所对应的键值...原创 2021-03-08 15:26:54 · 45 阅读 · 0 评论 -
168. Excel表列名称
本质就是:进制转换,把10进制转换为26进制1. N进制转换为10进制以N为权重,每个因子乘以权重再相加2. 10进制转换为N进制相除 / 取余数为因子理解进制的转换解题难点:正常转换成26进制的余数为0-15,本题要求的余数为1-26,如何消除1的差别呢?让除数减一,余数随之减一//取整数-返回商的整数部分(向下取整)%取模-返回除数的余数/ 除以...原创 2021-03-08 14:02:10 · 56 阅读 · 0 评论 -
2。两数相加:输入有序数组
给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target1. 有序数组的重要思想:双指针有序数组,设置双指针(首尾指针)由首尾两头向中间靠拢,若首指针和尾指针之和小于target,则首指针往中间靠(尾指针初始值就是数组最大值)如果两个指针之和sum=target,则得到要求的结果如果sum > target,移动尾指针(较大的元素),使sum变小如果sum < target,移动首指针,使sum增大参考代码暴力破解方式原创 2021-03-08 11:01:35 · 99 阅读 · 0 评论 -
1。两数之和
线性查找(暴力)解题思路:先枚举数组中的某一个数x,然后寻找数组是否存在target-x时间复杂度:O(N^2)class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: n = len(nums) for i in range(0,n): for j in range(i+1,n): if num...原创 2021-03-07 21:03:56 · 67 阅读 · 0 评论