diff --git a/README.md b/README.md index 61d12db..880ae49 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # 常见数据结构与算法小结(Java语言描述) -这是一个数据结构和算法笔记本,**书写** 并 **整理**一些常见的数据结构和其对应的相关操作。这其中**每一个类文件都是一个可以单独运行查看结果的main方法类**,相关的关键描述和想说的话都在代码的注释中。(欢迎一同补充和完善,2019年01月04日00:07:40置为public) +这是一个数据结构和算法笔记本,**书写** 并 **整理**一些常见的数据结构和其对应的相关操作。这其中**每一个类文件都是一个可以单独运行查看结果的main方法类** +,相关的关键描述和想说的话都在代码的注释中。(欢迎一同补充和完善,2019年01月04日00:07:40置为public) 1. 数组 - [搜索二维矩阵](/src/main/java/ds/FindInDoubleArray.java) @@ -26,32 +27,32 @@ - [线性表的删除(基于链式存储的物理结构实现)](/src/main/java/ds/LinkDelete.java) - [线性表的创建(基于链式存储的物理结构)头插法和尾插法](/src/main/java/ds/LinkCreate.java) - [查找线性表中的某一个元素(基于链式存储的物理结构实现)](/src/main/java/ds/LinkGet.java) - + 2. 栈 - [顺序栈(基于数组实现的栈)](/src/main/java/ds/ArrayStack.java) - [链式栈(基于链表实现的栈)](/src/main/java/ds/LinkStack.java) - + 3. 队列 - [顺序队列(基于数组实现的队列)](/src/main/java/ds/ArrayQueue.java) - [链式队列(基于链表实现的队列)](/src/main/java/ds/LinkQueue.java) - [循环队列(基于数组成环)](/src/main/java/ds/CircleQueue.java) - + 5. 递归 - [n的阶乘](/src/main/java/ds/Factorial.java) - [斐波拉切数列](/src/main/java/ds/FibonacciArray.java) - [位于第几排问题(递归、非递归分别实现)](/src/main/java/ds/LocationRow.java) - [n个台阶走法问题(每次可以走1个台阶或者2个台阶)](/src/main/java/ds/OneTwoStep.java) - [输出指定路径下的所有文件名(递归、非递归分别实现)](/src/main/java/ds/FileSearch.java) - + 6. 分治 - - [x的n次方](/src/main/java/ds/Pow.java) + - [x的n次方](/src/main/java/ds/Pow.java) 11. 堆 - [TopK](/src/main/java/ds/KthLargest.java) - [数组中的第K个最大元素](/src/main/java/ds/FindKthLargest.java) - [前K个高频元素](/src/main/java/ds/TopKFrequent.java) - [前K个高频单词](/src/main/java/ds/TopKWord.java) - + 13. 求数 - [求众数](/src/main/java/ds/MajorityElement.java) - [加一](/src/main/java/ds/PlusOne.java) @@ -62,10 +63,10 @@ 14. 搜索 - [广度优先搜索](/src/main/java/ds/LevelPrint.java) - [深度优先搜索](/src/main/java/ds/DepthPrint.java) - + 15. 图 - [图的表示](/src/main/java/ds/Graph.java) - + ## LeetCode 1. 反转 @@ -77,20 +78,20 @@ - [557.反转字符串中的单词III](/src/main/java/ds/reverse/leetcode557/Solution.java) - [867.转置矩阵](/src/main/java/ds/reverse/leetcode867/Solution.java) - [反转单链表的一部分区间](/src/main/java/ds/reverse/ReverseLinkN.java) - + 2. 二叉树 - [144.二叉树的前序遍历](/src/main/java/ds/tree/leetcode144/Solution.java) - [二叉树的下一个节点](/src/main/java/ds/tree/NextNodeInTree.java) - [100.相同的树](/src/main/java/ds/tree/leetcode100/Solution.java) - [101.对称二叉树](/src/main/java/ds/tree/leetcode101/Solution.java) - [116.填充每个节点的下一个右侧节点指针](/src/main/java/ds/tree/leetcode116/Solution.java) - - [将二叉树展开为链表](/src/main/java/ds/tree/FlattenLink.java) + - [114.将二叉树展开为链表](/src/main/java/ds/tree/leetcode114/Solution.java) - [654.最大二叉树](/src/main/java/ds/tree/leetcode654/Solution.java) - [105.从前序与中序遍历序列构造二叉树](/src/main/java/ds/tree/leetcode105/Solution.java) - [106.从中序与后序遍历序列构造二叉树](/src/main/java/ds/tree/leetcode106/Solution.java) - [寻找重复的子树](/src/main/java/ds/tree/FindDuplicateSubtrees.java) - - [二叉树的序列化和反序列化(前序遍历的序列化方式实现)](/src/main/java/ds/tree/SerializePreOrderTree.java) - - [二叉树的序列化和反序列化(后序遍历的序列化方式实现)](/src/main/java/ds/tree/SerializePostOrderTree.java) + - [297. 二叉树的序列化和反序列化(前序遍历的序列化方式实现)](/src/main/java/ds/tree/leetcode297/preorder/Solution.java) + - [297. 二叉树的序列化和反序列化(后序遍历的序列化方式实现)](/src/main/java/ds/tree/leetcode297/postorder/Solution.java) - [110.平衡二叉树](/src/main/java/ds/tree/leetcode110/Solution.java) - [剑指offer 55.二叉树的深度](/src/main/java/ds/tree/targetoffer55/Solution.java) - [104.二叉树的最大深度](/src/main/java/ds/tree/leetcode104/Solution.java) @@ -98,38 +99,49 @@ - [111.二叉树的最小深度](/src/main/java/ds/tree/leetcode111/Solution.java) - [二叉树的节点个数](/src/main/java/ds/tree/leetcode222/TreeNodeCount.java) - [222.完全二叉树的节点个数](/src/main/java/ds/tree/leetcode222/Solution.java) - - [257.二叉树的所有路径](/src/main/java/ds/tree/leetcode257/Solution.java) - [572.另一个树的子树](/src/main/java/ds/tree/leetcode572/Solution.java) - [404.左叶子之和](/src/main/java/ds/tree/leetcode404/Solution.java) - [617.合并二叉树](/src/main/java/ds/tree/leetcode617/Solution.java) - [236.二叉树的最近公共祖先](/src/main/java/ds/tree/leetcode236/Solution.java) - [814.二叉树剪枝](/src/main/java/ds/tree/leetcode814/Solution.java) - [965.单值二叉树](/src/main/java/ds/tree/leetcode965/Solution.java) - + 3. 二叉查找树 - [700.二叉搜索树中的搜索](/src/main/java/ds/bst/leetcode700/Solution.java) - [98.验证二叉搜索树](/src/main/java/ds/bst/leetcode98/Solution.java) - [530.二叉搜索树的最小绝对差](/src/main/java/ds/bst/leetcode530/Solution.java) + - [783.二叉搜索树节点最小距离](/src/main/java/ds/bst/leetcode783/Solution.java) - [501.二叉搜索树中的众数](/src/main/java/ds/bst/leetcode501/Solution.java) - - [二叉搜索树中第K小的元素](/src/main/java/ds/bst/KthSmallestInBST.java) + - [230.二叉搜索树中第K小的元素](/src/main/java/ds/bst/leetcode230/Solution.java) - [538.把二叉搜索树转换为累加树](/src/main/java/ds/bst/leetcode538/Solution.java) - [701.二叉搜索树中的插入操作](/src/main/java/ds/bst/leetcode701/Solution.java) - - [删除二叉搜索树中的节点](/src/main/java/ds/bst/BstDelete.java) - - [二叉查找树的插入、遍历、查找、删除、反转](/src/main/java/ds/bst/BinarySearchTree.java) - - [二叉查找树的最近公共祖先](/src/main/java/ds/bst/BSTreeLowestCommonAncestor.java) + - [450.删除二叉搜索树中的节点](/src/main/java/ds/bst/leetcode450/Solution.java) + - [二叉查找树的插入、遍历、查找、删除、反转](/src/main/java/ds/bst/base/BinarySearchTree.java) + - [235.二叉查找树的最近公共祖先](/src/main/java/ds/bst/leetcode235/Solution.java) - [剑指offer 36. 二叉搜索树与双向链表](/src/main/java/ds/bst/targetoffer36/Solution.java) - [108.将有序数组转换为二叉搜索树](/src/main/java/ds/bst/leetcode108/Solution.java) - [109.有序链表转换二叉搜索树](/src/main/java/ds/bst/leetcode109/Solution.java) + - [剑指offer 54.二叉搜索树的第k大节点](/src/main/java/ds/tree/target54/Solution.java) 4. 二分查找 + - [704.二分查找](/src/main/java/ds/binary/leetcode704/Solution.java) + - [69.x的平方根](/src/main/java/ds/binary/leetcode69/Solution.java) + - [374.猜数字大小](/src/main/java/ds/binary/leetcode374/Solution.java) + - [33.搜索旋转排序数组](/src/main/java/ds/binary/leetcode33/Solution.java) + - [278.第一个错误的版本](/src/main/java/ds/binary/leetcode278/Solution.java) + - [162.寻找峰值](/src/main/java/ds/binary/leetcode162/Solution.java) + - [852.山脉数组的峰顶索引](/src/main/java/ds/binary/leetcode162/Solution.java) + - [剑指 Offer II 069.山峰数组的顶部](/src/main/java/ds/binary/leetcode162/Solution.java) + - [153.寻找旋转排序数组中的最小值](/src/main/java/ds/binary/leetcode153/Solution.java) + - [34.在排序数组中查找元素的第一个和最后一个位置](/src/main/java/ds/binary/leetcode34/Solution.java) - [二分查找(递归和非递归实现)](/src/main/java/ds/binary/BinarySearch.java) - [查找第一个值等于给定值的元素](/src/main/java/ds/binary/BSFirstEquals.java) - [查找最后一个值等于给定值的元素](/src/main/java/ds/binary/BSEndEquals.java) - [查找第一个大于等于给定值的元素](/src/main/java/ds/binary/BSFirstMore.java) - [查找最后一个小于等于给定值的元素](/src/main/java/ds/binary/BSEndLess.java) - - [x的平方根](/src/main/java/ds/binary/MySqrt.java) - [35.搜索插入位置](/src/main/java/ds/binary/leetcode35/Solution.java) - + - [剑指 Offer II 068.查找插入位置](/src/main/java/ds/binary/targetofferII068/Solution.java) + 5. 双指针 - [141.环形链表](/src/main/java/ds/pointer/leetcode141/Solution.java) - [142.环形链表II (已知链表当中有环,返回这个环的起始位置)](/src/main/java/ds/pointer/leetcode142/Solution.java) @@ -146,10 +158,10 @@ - [18.四数之和](/src/main/java/ds/pointer/leetcode18/Solution.java) - [剑指offer 05.替换空格](/src/main/java/ds/pointer/targetoffer05/Solution.java) - [剑指 Offer II 014.字符串中的变位词](/src/main/java/ds/pointer/targetofferII014/Solution.java) - - [剑指 Offer II 011.0 和 1 个数相同的子数组](/src/main/java/ds/hashmap/targetofferII011/Solution.java) - - [剑指 Offer II 012.左右两边子数组的和相等](/src/main/java/ds/hashmap/targetofferII012/Solution.java) - [剑指 Offer II 015.字符串中的所有变位词](/src/main/java/ds/pointer/targetofferII015/Solution.java) - + - [11.盛最多水的容器](/src/main/java/ds/pointer/leetcode11/Solution.java) + - [42.接雨水](/src/main/java/ds/pointer/leetcode42/Solution.java) + 6. 滑动窗口 - [一个数组所有连续K个元素构成的子集的平均数](/src/main/java/ds/sliding/ArrayAverages.java) - [最小覆盖子串](/src/main/java/ds/sliding/MinWindow.java) @@ -164,38 +176,39 @@ - [380.常数时间插入、删除和获取随机元素](/src/main/java/ds/design/leetcode380/RandomizedSet.java) - [232.用栈实现队列](/src/main/java/ds/stack/leetcode232/MyQueue.java) - [225.用队列实现栈](/src/main/java/ds/queue/leetcode225/MyStack.java) - + 8. 位运算 - [位1的个数](/src/main/java/ds/bit/HammingWeight.java) - [2的幂](/src/main/java/ds/bit/IsPowerOfTwo.java) - [比特位计数](/src/main/java/ds/bit/CountBits.java) - [136.只出现一次的数字](/src/main/java/ds/bit/leetcode136/Solution.java) - [缺失数字](/src/main/java/ds/bit/MissingNumber.java) - + 9. 回溯(DFS) + 剪枝 - 排列 - - [46.全排列](/src/main/java/ds/backtrack/Permute.java) - - [47.全排列II](/src/main/java/ds/backtrack/PermuteUnique.java) + - [46.全排列](/src/main/java/ds/backtrack/Permute.java) + - [47.全排列II](/src/main/java/ds/backtrack/PermuteUnique.java) - 组合 - - [77.组合](/src/main/java/ds/backtrack/Combine.java) - - [216.组合总和III](/src/main/java/ds/backtrack/CombinationSum3.java) - - [39.组合总和](/src/main/java/ds/backtrack/CombinationSum.java) - - [17.电话号码的字母组合](/src/main/java/ds/backtrack/LetterCombinations.java) - - [40.组合总和II](/src/main/java/ds/backtrack/CombinationSum2.java) + - [77.组合](/src/main/java/ds/backtrack/Combine.java) + - [216.组合总和III](/src/main/java/ds/backtrack/CombinationSum3.java) + - [39.组合总和](/src/main/java/ds/backtrack/CombinationSum.java) + - [17.电话号码的字母组合](/src/main/java/ds/backtrack/LetterCombinations.java) + - [40.组合总和II](/src/main/java/ds/backtrack/CombinationSum2.java) - 分割 - - [131.分割回文串](/src/main/java/ds/backtrack/Partition.java) - - [93. 复原IP地址](/src/main/java/ds/backtrack/RestoreIpAddresses.java) + - [131.分割回文串](/src/main/java/ds/backtrack/Partition.java) + - [93. 复原IP地址](/src/main/java/ds/backtrack/RestoreIpAddresses.java) - 子集 - - [78.子集](/src/main/java/ds/backtrack/Subsets.java) - - [90.子集II](/src/main/java/ds/backtrack/SubsetsWithDup.java) - - [491.递增子序列](/src/main/java/ds/backtrack/FindSubsequences.java) + - [78.子集](/src/main/java/ds/backtrack/Subsets.java) + - [90.子集II](/src/main/java/ds/backtrack/SubsetsWithDup.java) + - [491.递增子序列](/src/main/java/ds/backtrack/FindSubsequences.java) - 棋盘 - - [51.N皇后](/src/main/java/ds/backtrack/SolveNQueens.java) - - [37.解数独](/src/main/java/ds/backtrack/SolveSudoku.java) + - [51.N皇后](/src/main/java/ds/backtrack/SolveNQueens.java) + - [37.解数独](/src/main/java/ds/backtrack/SolveSudoku.java) - 路径 - - [112.路径总和](/src/main/java/ds/tree/leetcode112/Solution.java) - - [113.路径总和II](/src/main/java/ds/tree/leetcode113/Solution.java) - + - [112.路径总和](/src/main/java/ds/tree/leetcode112/Solution.java) + - [113.路径总和II](/src/main/java/ds/tree/leetcode113/Solution.java) + - [257.二叉树的所有路径](/src/main/java/ds/tree/leetcode257/Solution.java) + 10. 广度优先搜索(BFS) - [111.二叉树的最小深度](/src/main/java/ds/bfs/leetcode111/Solution.java) - [102.二叉树的层序遍历](/src/main/java/ds/bfs/leetcode102/Solution.java) @@ -208,7 +221,6 @@ - [剑指offer 32 - II.从上到下打印二叉树II](/src/main/java/ds/bfs/targetoffer322/Solution.java) - [剑指offer 32 - III.从上到下打印二叉树III](/src/main/java/ds/bfs/targetoffer323/Solution.java) - [103.二叉树的锯齿形层次遍历](/src/main/java/ds/bfs/leetcode103/Solution.java) - - [剑指offer 54.二叉搜索树的第k大节点](/src/main/java/ds/bst/target54/Solution.java) - [117.填充每个节点的下一个右侧节点指针II](/src/main/java/ds/bfs/leetcode117/Solution.java) 11. 数组 @@ -221,7 +233,7 @@ - [剑指offer 06.从尾到头打印链表](/src/main/java/ds/link/targetoffer06/Solution.java) - [剑指offer 18.删除链表中的节点](/src/main/java/ds/link/targetoffer18/Solution.java) - [234.回文链表](/src/main/java/ds/link/leetcode234/Solution.java) - + 13. 哈希表 - [242.有效的字母异位词](/src/main/java/ds/hashmap/leetcode242/Solution.java) - [349.两个数组的交集](/src/main/java/ds/hashmap/leetcode349/Solution.java) @@ -237,7 +249,7 @@ - [剑指 Offer II 011.0 和 1 个数相同的子数组](/src/main/java/ds/hashmap/targetofferII011/Solution.java) - [剑指 Offer II 012.左右两边子数组的和相等](/src/main/java/ds/hashmap/targetofferII012/Solution.java) - [剑指 Offer II 013.二维子矩阵的和](/src/main/java/ds/hashmap/targetofferII013/NumMatrix.java) - + 14. 字符串 - [Fizz Buzz](/src/main/java/ds/string/FizzBuzz.java) - [验证回文字符](/src/main/java/ds/string/ValidPalindromeString.java) @@ -247,7 +259,7 @@ - [根据字符出现频率排序](/src/main/java/ds/string/FrequencySort.java) - [验证回文串](/src/main/java/ds/string/PalindromeI.java) - [单词拆分](/src/main/java/ds/string/WordBreak.java) - + 15. 排序 - [冒泡排序](/src/main/java/ds/sort/BubbleSort.java) - [插入排序](/src/main/java/ds/sort/InsertSort.java) @@ -255,47 +267,112 @@ - [快速排序](/src/main/java/ds/sort/QuickSort.java) - [计数排序](/src/main/java/ds/sort/CountSort.java) - [堆排序](/src/main/java/ds/sort/BigHeapSort.java) - + 16. 贪心 - [455.分发饼干](/src/main/java/ds/greedy/leetcode455/Solution.java) - [376.摆动序列](/src/main/java/ds/greedy/leetcode376/Solution.java) - [53.最大子序和](/src/main/java/ds/greedy/leetcode53/Solution.java) - [122.买卖股票的最佳时机II](/src/main/java/ds/greedy/leetcode122/Solution.java) - + 17. 动态规划(DP) - 斐波拉切 - - [斐波拉契数列的4种解法](/src/main/java/ds/dp/Fipolach.java) - - [509.斐波那契数](/src/main/java/ds/dp/leetcode509/Solution.java) - - [70.爬楼梯](/src/main/java/ds/dp/leetcode70/Solution.java) - - [746.使用最小花费爬楼梯](/src/main/java/ds/dp/leetcode746/Solution.java) + - [斐波拉契数列的4种解法](/src/main/java/ds/dp/Fipolach.java) + - [509.斐波那契数](/src/main/java/ds/dp/leetcode509/Solution.java) + - [70.爬楼梯](/src/main/java/ds/dp/leetcode70/Solution.java) + - [746.使用最小花费爬楼梯](/src/main/java/ds/dp/leetcode746/Solution.java) - 路径 - - [60.不同路径](/src/main/java/ds/dp/leetcode60/Solution.java) - - [63.不同路径II](/src/main/java/ds/dp/leetcode63/Solution.java) + - [60.不同路径](/src/main/java/ds/dp/leetcode60/Solution.java) + - [63.不同路径II](/src/main/java/ds/dp/leetcode63/Solution.java) - [96.不同的二叉搜索树](/src/main/java/ds/dp/leetcode96/Solution.java) - [343.整数拆分](/src/main/java/ds/dp/leetcode343/Solution.java) - [三角形最小路径和](/src/main/java/ds/dp/MinimumTotal.java) - [乘积最大子序列](/src/main/java/ds/dp/MaxProduct.java) - 打家劫舍 - - [198.打家劫舍](/src/main/java/ds/dp/leetcode198/Solution.java) - - [213.打家劫舍II](/src/main/java/ds/dp/leetcode213/Solution.java) - - [337.打家劫舍III](/src/main/java/ds/dp/leetcode337/Solution.java) + - [198.打家劫舍](/src/main/java/ds/dp/leetcode198/Solution.java) + - [213.打家劫舍II](/src/main/java/ds/dp/leetcode213/Solution.java) + - [337.打家劫舍III](/src/main/java/ds/dp/leetcode337/Solution.java) - 杨辉三角 - - [118.杨辉三角](/src/main/java/ds/dp/leetcode118/Solution.java) - - [119.杨辉三角II](/src/main/java/ds/dp/leetcode119/Solution.java) - + - [118.杨辉三角](/src/main/java/ds/dp/leetcode118/Solution.java) + - [119.杨辉三角II](/src/main/java/ds/dp/leetcode119/Solution.java) + 18. 栈 - [20.有效的括号](/src/main/java/ds/stack/leetcode20/Solution.java) - [1047.删除字符串中的所有相邻重复项](/src/main/java/ds/stack/leetcode1047/Solution.java) - [150.逆波兰表达式求值](/src/main/java/ds/stack/leetcode150/Solution.java) - 单调栈 - - [739.每日温度](/src/main/java/ds/stack/leetcode739/Solution.java) - + - [739.每日温度](/src/main/java/ds/stack/leetcode739/Solution.java) + ## 多线程 - - [1114.按序打印](/src/main/java/thread/leetcode1114/Foo.java) - - [1115.交替打印FooBar](/src/main/java/thread/leetcode1115/FooBar.java) - - [1116.打印零与奇偶数](/src/main/java/thread/leetcode1116/ZeroEvenOdd.java) - - [1117.H2O生成](/src/main/java/thread/leetcode1117/H2O.java) - - [1195.交替打印字符串](/src/main/java/thread/leetcode1195/FizzBuzz.java) + +- [1114.按序打印](/src/main/java/thread/leetcode1114/Foo.java) +- [1115.交替打印FooBar](/src/main/java/thread/leetcode1115/FooBar.java) +- [1116.打印零与奇偶数](/src/main/java/thread/leetcode1116/ZeroEvenOdd.java) +- [1117.H2O生成](/src/main/java/thread/leetcode1117/H2O.java) +- [1195.交替打印字符串](/src/main/java/thread/leetcode1195/FizzBuzz.java) +- [1226.哲学家进餐](/src/main/java/thread/leetcode1226/DiningPhilosophers.java) + +## SQL + +- [175.组合两个表](/src/main/java/db/leetcode175/Solution.sql) +- [176.第二高的薪水](/src/main/java/db/leetcode176/Solution.sql) +- [177.第N高的薪水](/src/main/java/db/leetcode177/Solution.sql) +- [178.分数排名](/src/main/java/db/leetcode178/Solution.sql) +- [180.连续出现的数字](/src/main/java/db/leetcode180/Solution.sql) +- [181.超过经理收入的员工](/src/main/java/db/leetcode181/Solution.sql) +- [182.查找重复的电子邮箱](/src/main/java/db/leetcode182/Solution.sql) +- [183.从不订购的客户](/src/main/java/db/leetcode183/Solution.sql) +- [196.删除重复的电子邮箱](/src/main/java/db/leetcode196/Solution.sql) +- [197.上升的温度](/src/main/java/db/leetcode197/Solution.sql) +- [511.游戏玩法分析I](/src/main/java/db/leetcode511/Solution.sql) +- [584.寻找用户推荐人](/src/main/java/db/leetcode584/Solution.sql) +- [595.大的国家](/src/main/java/db/leetcode595/Solution.sql) +- [1757.可回收且低脂的产品](/src/main/java/db/leetcode1757/Solution.sql) +- [1873.计算特殊奖金](/src/main/java/db/leetcode1873/Solution.sql) +- [627.变更性别](/src/main/java/db/leetcode627/Solution.sql) +- [586.订单最多的客户](/src/main/java/db/leetcode586/Solution.sql) +- [620.有趣的电影](/src/main/java/db/leetcode620/Solution.sql) +- [596.超过5名学生的课](/src/main/java/db/leetcode596/Solution.sql) +- [1667.修复表中的名字](/src/main/java/db/leetcode1667/Solution.sql) +- [1484.按日期分组销售产品](/src/main/java/db/leetcode1484/Solution.sql) +- [1527.患某种疾病的患者](/src/main/java/db/leetcode1527/Solution.sql) +- [607.销售员](/src/main/java/db/leetcode607/Solution.sql) +- [608.树节点](/src/main/java/db/leetcode608/Solution.sql) +- [1084.销售分析III](/src/main/java/db/leetcode1084/Solution.sql) +- [626.换座位](/src/main/java/db/leetcode626/Solution.sql) +- [1050.合作过至少三次的演员和导演](/src/main/java/db/leetcode1050/Solution.sql) +- [1148.文章浏览I](/src/main/java/db/leetcode1148/Solution.sql) +- [1179.重新格式化部门表](/src/main/java/db/leetcode1179/Solution.sql) +- [1407.排名靠前的旅行者](/src/main/java/db/leetcode1407/Solution.sql) +- [1581.进店却未进行过交易的顾客](/src/main/java/db/leetcode1581/Solution.sql) +- [1795.每个产品在不同商店的价格](/src/main/java/db/leetcode1795/Solution.sql) +- [1965.丢失信息的雇员](/src/main/java/db/leetcode1965/Solution.sql) +- [1729.求关注者的数量](/src/main/java/db/leetcode1729/Solution.sql) +- [1890.2020年最后一次登录](/src/main/java/db/leetcode1890/Solution.sql) +- [1393.股票的资本损益](/src/main/java/db/leetcode1393/Solution.sql) +- [1141.查询近30天活跃用户数](/src/main/java/db/leetcode1141/Solution.sql) +- [184.部门工资最高的员工](/src/main/java/db/leetcode184/Solution.sql) +- [1741.查找每个员工花费的总时间](/src/main/java/db/leetcode1741/Solution.sql) +- [1587.银行账户概要II](/src/main/java/db/leetcode1587/Solution.sql) +- [1158.市场分析I](/src/main/java/db/leetcode1158/Solution.sql) + +## 华为OD + +- [HJ1.字符串最后一个单词的长度](/src/main/java/od/HJ1/Main.java) +- [HJ2.计算某字符出现次数](/src/main/java/od/HJ2/Main.java) +- [HJ3.明明的随机数](/src/main/java/od/HJ3/Main.java) +- [HJ4.字符串分隔](/src/main/java/od/HJ4/Main.java) +- [HJ5.进制转换](/src/main/java/od/HJ5/Main.java) +- [**HJ6.质数因子**](/src/main/java/od/HJ6/Main.java) +- [HJ7.取近似值](/src/main/java/od/HJ7/Main.java) +- [HJ8.合并表记录](/src/main/java/od/HJ8/Main.java) +- [HJ9.提取不重复的整数](/src/main/java/od/HJ9/Main.java) +- [HJ10.字符个数统计](/src/main/java/od/HJ10/Main.java) +- [HJ11.数字颠倒](/src/main/java/od/HJ11/Main.java) +- [HJ12.字符串反转](/src/main/java/od/HJ12/Main.java) +- [HJ13.句子逆序](/src/main/java/od/HJ13/Main.java) +- [HJ14.字符串排序](/src/main/java/od/HJ14/Main.java) +- [**HJ15.求int型正整数在内存中存储时1的个数**](/src/main/java/od/HJ15/Main.java) +- [HJ106.字符逆序](/src/main/java/od/HJ106/Main.java) ## PAT diff --git a/src/main/java/db/leetcode1050/Solution.sql b/src/main/java/db/leetcode1050/Solution.sql new file mode 100644 index 0000000..c13e835 --- /dev/null +++ b/src/main/java/db/leetcode1050/Solution.sql @@ -0,0 +1,7 @@ +-- 1050. 合作过至少三次的演员和导演 +-- https://leetcode.cn/problems/actors-and-directors-who-cooperated-at-least-three-times/ +-- yangyi 2022年08月16日17:06:19 +select actor_id, director_id +from ActorDirector +group by actor_id, director_id +having count(actor_id)>= 3 and count(director_id)>= 3 \ No newline at end of file diff --git a/src/main/java/db/leetcode1084/Solution.sql b/src/main/java/db/leetcode1084/Solution.sql new file mode 100644 index 0000000..8d81ad7 --- /dev/null +++ b/src/main/java/db/leetcode1084/Solution.sql @@ -0,0 +1,8 @@ +-- 1084. 销售分析III +-- https://leetcode.cn/problems/sales-analysis-iii/ +-- yangyi 2022年08月16日15:27:00 +select p.product_id, p.product_name +from Product as p +left join Sales as s on p.product_id = s.product_id +group by s.product_id +having min(sale_date)>= '2019-01-01' and max(sale_date) <= '2019-03-31' \ No newline at end of file diff --git a/src/main/java/db/leetcode1141/Solution.sql b/src/main/java/db/leetcode1141/Solution.sql new file mode 100644 index 0000000..27cba2c --- /dev/null +++ b/src/main/java/db/leetcode1141/Solution.sql @@ -0,0 +1,7 @@ +-- 1141. 查询近30天活跃用户数 +-- https://leetcode.cn/problems/user-activity-for-the-past-30-days-i/ +-- yangyi 2022年08月19日16:02:56 +select activity_date as day, count(distinct user_id) as active_users +from Activity +where datediff('2019-07-27', activity_date)> 0 and datediff('2019-07-27', activity_date) < 30 +group by activity_date \ No newline at end of file diff --git a/src/main/java/db/leetcode1148/Solution.sql b/src/main/java/db/leetcode1148/Solution.sql new file mode 100644 index 0000000..0a6a7d1 --- /dev/null +++ b/src/main/java/db/leetcode1148/Solution.sql @@ -0,0 +1,7 @@ +-- 1148. 文章浏览 I +-- https://leetcode.cn/problems/article-views-i/ +-- yangyi 2022年08月16日17:20:22 +select distinct author_id as id +from Views +where author_id = viewer_id +order by author_id \ No newline at end of file diff --git a/src/main/java/db/leetcode1158/Solution.sql b/src/main/java/db/leetcode1158/Solution.sql new file mode 100644 index 0000000..7aa57b8 --- /dev/null +++ b/src/main/java/db/leetcode1158/Solution.sql @@ -0,0 +1,12 @@ +-- 1158. 市场分析 I +-- https://leetcode.cn/problems/market-analysis-i/ +-- yangyi 2022年08月23日17:47:06 +select Users.user_id as buyer_id, join_date, ifnull(UserBuy.cnt, 0) as orders_in_2019 +from Users +left join ( + select buyer_id, count(order_id) cnt + from Orders + where order_date between '2019-01-01' and '2019-12-31' + group by buyer_id +) UserBuy +on Users.user_id = UserBuy.buyer_id \ No newline at end of file diff --git a/src/main/java/db/leetcode1179/Solution.sql b/src/main/java/db/leetcode1179/Solution.sql new file mode 100644 index 0000000..ad7b4f3 --- /dev/null +++ b/src/main/java/db/leetcode1179/Solution.sql @@ -0,0 +1,18 @@ +-- 1179. 重新格式化部门表 +-- https://leetcode.cn/problems/reformat-department-table/ +-- yangyi 2022年08月16日17:40:55 +select id, +sum(case when month = 'Jan' then revenue end) as Jan_Revenue, +sum(case when month = 'Feb' then revenue end) as Feb_Revenue, +sum(case when month = 'Mar' then revenue end) as Mar_Revenue, +sum(case when month = 'Apr' then revenue end) as Apr_Revenue, +sum(case when month = 'May' then revenue end) as May_Revenue, +sum(case when month = 'Jun' then revenue end) as Jun_Revenue, +sum(case when month = 'Jul' then revenue end) as Jul_Revenue, +sum(case when month = 'Aug' then revenue end) as Aug_Revenue, +sum(case when month = 'Sep' then revenue end) as Sep_Revenue, +sum(case when month = 'Oct' then revenue end) as Oct_Revenue, +sum(case when month = 'Nov' then revenue end) as Nov_Revenue, +sum(case when month = 'Dec' then revenue end) as Dec_Revenue +from Department +group by id \ No newline at end of file diff --git a/src/main/java/db/leetcode1393/Solution.sql b/src/main/java/db/leetcode1393/Solution.sql new file mode 100644 index 0000000..acefa99 --- /dev/null +++ b/src/main/java/db/leetcode1393/Solution.sql @@ -0,0 +1,9 @@ +-- 1393. 股票的资本损益 +-- https://leetcode.cn/problems/capital-gainloss/ +-- yangyi 2022年08月19日15:36:10 +select stock_name, sum( +case when operation = 'Buy' then -price + when operation = 'Sell' then price +end) as capital_gain_loss +from Stocks +group by stock_name \ No newline at end of file diff --git a/src/main/java/db/leetcode1407/Solution.sql b/src/main/java/db/leetcode1407/Solution.sql new file mode 100644 index 0000000..db38f13 --- /dev/null +++ b/src/main/java/db/leetcode1407/Solution.sql @@ -0,0 +1,12 @@ +-- 1407. 排名靠前的旅行者 +-- https://leetcode.cn/problems/top-travellers/ +-- yangyi 2022年08月16日18:00:42 +select u.name, +case +when sum(r.distance) is null then 0 +else sum(r.distance) +end as travelled_distance +from Users as u +left join Rides as r on u.id = r.user_id +group by r.user_id +order by travelled_distance DESC, u.name \ No newline at end of file diff --git a/src/main/java/db/leetcode1484/Solution.sql b/src/main/java/db/leetcode1484/Solution.sql new file mode 100644 index 0000000..7dcd1c0 --- /dev/null +++ b/src/main/java/db/leetcode1484/Solution.sql @@ -0,0 +1,6 @@ +-- 1484. 按日期分组销售产品 +-- https://leetcode.cn/problems/group-sold-products-by-the-date/ +-- yanyi 2022年08月16日11:38:09 +select sell_date, count(distinct product) as num_sold, group_concat(distinct product order by product) as products +from Activities +group by sell_date \ No newline at end of file diff --git a/src/main/java/db/leetcode1527/Solution.sql b/src/main/java/db/leetcode1527/Solution.sql new file mode 100644 index 0000000..30eaa79 --- /dev/null +++ b/src/main/java/db/leetcode1527/Solution.sql @@ -0,0 +1,6 @@ +-- 1527. 患某种疾病的患者 +-- https://leetcode.cn/problems/patients-with-a-condition/ +-- yangyi 2022年08月16日12:02:21 +select * +from Patients +where conditions like 'DIAB1%' or conditions like '% DIAB1%' \ No newline at end of file diff --git a/src/main/java/db/leetcode1581/Solution.sql b/src/main/java/db/leetcode1581/Solution.sql new file mode 100644 index 0000000..317a3a7 --- /dev/null +++ b/src/main/java/db/leetcode1581/Solution.sql @@ -0,0 +1,8 @@ +-- 1581. 进店却未进行过交易的顾客 +-- https://leetcode.cn/problems/customer-who-visited-but-did-not-make-any-transactions/ +-- yangyi 2022年08月16日19:15:39 +select v.customer_id, count(customer_id) as count_no_trans +from Visits as v +left join Transactions as t on v.visit_id = t.visit_id +where t.amount is null +group by customer_id \ No newline at end of file diff --git a/src/main/java/db/leetcode1587/Solution.sql b/src/main/java/db/leetcode1587/Solution.sql new file mode 100644 index 0000000..857f75c --- /dev/null +++ b/src/main/java/db/leetcode1587/Solution.sql @@ -0,0 +1,8 @@ +-- 1587. 银行账户概要 II +-- https://leetcode.cn/problems/bank-account-summary-ii/ +-- yangyi 2022年08月23日17:06:51 +select u.name, sum(t.amount) as balance +from Users as u +left join Transactions as t on t.account = u.account +group by t.account +having sum(t.amount)> 10000 \ No newline at end of file diff --git a/src/main/java/db/leetcode1667/Solution.sql b/src/main/java/db/leetcode1667/Solution.sql new file mode 100644 index 0000000..ee2597b --- /dev/null +++ b/src/main/java/db/leetcode1667/Solution.sql @@ -0,0 +1,7 @@ +-- 1667. 修复表中的名字 +-- https://leetcode.cn/problems/fix-names-in-a-table/ +-- yangyi 2022年08月16日11:09:30 +select user_id, +concat(upper(left(name, 1)), lower(substr(name, 2))) as name +from Users +order by user_id \ No newline at end of file diff --git a/src/main/java/db/leetcode1729/Solution.sql b/src/main/java/db/leetcode1729/Solution.sql new file mode 100644 index 0000000..0a7a703 --- /dev/null +++ b/src/main/java/db/leetcode1729/Solution.sql @@ -0,0 +1,7 @@ +-- 1729. 求关注者的数量 +-- https://leetcode.cn/problems/find-followers-count/ +-- yangyi 2022年08月17日00:37:21 +select user_id, count(follower_id) as followers_count +from Followers +group by user_id +order by user_id \ No newline at end of file diff --git a/src/main/java/db/leetcode1741/Solution.sql b/src/main/java/db/leetcode1741/Solution.sql new file mode 100644 index 0000000..ca71e59 --- /dev/null +++ b/src/main/java/db/leetcode1741/Solution.sql @@ -0,0 +1,6 @@ +-- 1741. 查找每个员工花费的总时间 +-- https://leetcode.cn/problems/find-total-time-spent-by-each-employee/ +-- yangyi 2022年08月22日14:37:39 +select event_day as day, emp_id, sum(out_time - in_time) as total_time +from Employees +group by event_day, emp_id \ No newline at end of file diff --git a/src/main/java/db/leetcode175/Solution.sql b/src/main/java/db/leetcode175/Solution.sql new file mode 100644 index 0000000..357de70 --- /dev/null +++ b/src/main/java/db/leetcode175/Solution.sql @@ -0,0 +1,6 @@ +-- 175. 组合两个表 +-- https://leetcode.cn/problems/combine-two-tables/ +-- @author yangyi 2022年08月12日10:58:23 +select Person.FirstName, Person.LastName, Address.City, Address.State +from Person left join Address on +Person.PersonId = Address.PersonId \ No newline at end of file diff --git a/src/main/java/db/leetcode1757/Solution.sql b/src/main/java/db/leetcode1757/Solution.sql new file mode 100644 index 0000000..5436906 --- /dev/null +++ b/src/main/java/db/leetcode1757/Solution.sql @@ -0,0 +1,6 @@ +-- 1757. 可回收且低脂的产品 +-- https://leetcode.cn/problems/recyclable-and-low-fat-products/ +-- yangyi 2022年08月15日11:37:47 +select product_id from Products +where low_fats = 'Y' +and recyclable = 'Y' \ No newline at end of file diff --git a/src/main/java/db/leetcode176/Solution.sql b/src/main/java/db/leetcode176/Solution.sql new file mode 100644 index 0000000..9051455 --- /dev/null +++ b/src/main/java/db/leetcode176/Solution.sql @@ -0,0 +1,4 @@ +-- 176. 第二高的薪水 +-- https://leetcode.cn/problems/second-highest-salary/ +-- @author yangyi 2022年08月12日11:05:46s +select (select distinct salary from Employee order by salary DESC limit 1 offset 1) as SecondHighestSalary \ No newline at end of file diff --git a/src/main/java/db/leetcode177/Solution.sql b/src/main/java/db/leetcode177/Solution.sql new file mode 100644 index 0000000..ef94982 --- /dev/null +++ b/src/main/java/db/leetcode177/Solution.sql @@ -0,0 +1,10 @@ +-- 177. 第N高的薪水 +-- https://leetcode.cn/problems/nth-highest-salary/ +-- yangyi 2022年08月12日11:21:59 +CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT +BEGIN + set n = n - 1; + RETURN ( + select (select distinct salary from Employee order by salary DESC limit 1 offset n) + ); +END \ No newline at end of file diff --git a/src/main/java/db/leetcode178/Solution.sql b/src/main/java/db/leetcode178/Solution.sql new file mode 100644 index 0000000..190437d --- /dev/null +++ b/src/main/java/db/leetcode178/Solution.sql @@ -0,0 +1,4 @@ +-- 178. 分数排名 +-- https://leetcode.cn/problems/rank-scores/ +-- yangyi 2022年08月12日11:38:32 +select A.score, (select count(distinct B.score) from Scores as B where B.score>= A.score) as 'rank' from Scores as A order by A.score DESC \ No newline at end of file diff --git a/src/main/java/db/leetcode1795/Solution.sql b/src/main/java/db/leetcode1795/Solution.sql new file mode 100644 index 0000000..9736fb7 --- /dev/null +++ b/src/main/java/db/leetcode1795/Solution.sql @@ -0,0 +1,11 @@ +-- 1795. 每个产品在不同商店的价格 +-- https://leetcode.cn/problems/rearrange-products-table/ +-- yangyi 2022年08月17日17:04:54 +select product_id, 'store1' as store, store1 as price +from Products where store1 is not null +union +select product_id, 'store2' as store, store2 as price +from Products where store2 is not null +union +select product_id, 'store3' as store, store3 as price +from Products where store3 is not null \ No newline at end of file diff --git a/src/main/java/db/leetcode180/Solution.sql b/src/main/java/db/leetcode180/Solution.sql new file mode 100644 index 0000000..a2e3e47 --- /dev/null +++ b/src/main/java/db/leetcode180/Solution.sql @@ -0,0 +1,4 @@ +-- 180. 连续出现的数字 +-- https://leetcode.cn/problems/consecutive-numbers/ +-- yangyi 2022年08月12日11:57:57 +select distinct a.num as ConsecutiveNums from Logs a, Logs as b, Logs as c where a.id = b.id - 1 and b.id = c.id - 1 and a.num = b.num and b.num = c.num \ No newline at end of file diff --git a/src/main/java/db/leetcode181/Solution.sql b/src/main/java/db/leetcode181/Solution.sql new file mode 100644 index 0000000..3606294 --- /dev/null +++ b/src/main/java/db/leetcode181/Solution.sql @@ -0,0 +1,4 @@ +-- 181. 超过经理收入的员工 +-- https://leetcode.cn/problems/employees-earning-more-than-their-managers/ +-- yangyi 2022年08月12日12:15:42 +select a.name as 'Employee' from Employee as a, Employee as b where a.managerId = b.id and a.salary> b.salary \ No newline at end of file diff --git a/src/main/java/db/leetcode182/Solution.sql b/src/main/java/db/leetcode182/Solution.sql new file mode 100644 index 0000000..0c10144 --- /dev/null +++ b/src/main/java/db/leetcode182/Solution.sql @@ -0,0 +1,4 @@ +-- 182. 查找重复的电子邮箱 +-- https://leetcode.cn/problems/duplicate-emails/ +-- yangyi 2022年08月12日14:18:41 +select Email from Person group by Email having count(Email)> 1 \ No newline at end of file diff --git a/src/main/java/db/leetcode183/Solution.sql b/src/main/java/db/leetcode183/Solution.sql new file mode 100644 index 0000000..7984454 --- /dev/null +++ b/src/main/java/db/leetcode183/Solution.sql @@ -0,0 +1,4 @@ +-- 183. 从不订购的客户 +-- https://leetcode.cn/problems/customers-who-never-order/ +-- yangyi 2022年08月12日14:39:46 +select Customers.name as 'Customers' from Customers left join Orders on Customers.id = Orders.CustomerId where Orders.CustomerId is null \ No newline at end of file diff --git a/src/main/java/db/leetcode184/Solution.sql b/src/main/java/db/leetcode184/Solution.sql new file mode 100644 index 0000000..e9e4b85 --- /dev/null +++ b/src/main/java/db/leetcode184/Solution.sql @@ -0,0 +1,11 @@ +-- 184. 部门工资最高的员工 +-- https://leetcode.cn/problems/department-highest-salary/ +-- yangyi 2022年08月19日18:30:24 +select d.name as 'Department', e.name as 'Employee', e.salary as Salary +from Employee as e +left join Department as d on e.departmentId = d.id +where (e.departmentId, e.salary) in ( +select departmentId, max(salary) +from Employee +group by departmentId +) \ No newline at end of file diff --git a/src/main/java/db/leetcode1873/Solution.sql b/src/main/java/db/leetcode1873/Solution.sql new file mode 100644 index 0000000..8cb6581 --- /dev/null +++ b/src/main/java/db/leetcode1873/Solution.sql @@ -0,0 +1,11 @@ +-- 1873. 计算特殊奖金 +-- https://leetcode.cn/problems/calculate-special-bonus/ +-- yangyi 2022年08月15日16:08:03 +select +employee_id, +case +when mod(employee_id, 2) 0 and left(name, 1) 'M' then salary +else 0 +end as bonus +from Employees +order by employee_id \ No newline at end of file diff --git a/src/main/java/db/leetcode1890/Solution.sql b/src/main/java/db/leetcode1890/Solution.sql new file mode 100644 index 0000000..ffbef35 --- /dev/null +++ b/src/main/java/db/leetcode1890/Solution.sql @@ -0,0 +1,7 @@ +-- 1890. 2020年最后一次登录 +-- https://leetcode.cn/problems/the-latest-login-in-2020/ +-- yangyi 2022年08月19日15:04:26 +select user_id, max(time_stamp) as last_stamp +from Logins +where left(time_stamp, 4) = '2020' +group by user_id \ No newline at end of file diff --git a/src/main/java/db/leetcode196/Solution.sql b/src/main/java/db/leetcode196/Solution.sql new file mode 100644 index 0000000..5fc49c9 --- /dev/null +++ b/src/main/java/db/leetcode196/Solution.sql @@ -0,0 +1,7 @@ +-- 196. 删除重复的电子邮箱 +-- https://leetcode.cn/problems/delete-duplicate-emails/ +-- yangyi 2022年08月12日18:16:40 +--# Please write a DELETE statement and DO NOT write a SELECT statement. +delete p1 from Person as p1, Person as p2 +where p1.email = p2.email +and p1.id> p2.id \ No newline at end of file diff --git a/src/main/java/db/leetcode1965/Solution.sql b/src/main/java/db/leetcode1965/Solution.sql new file mode 100644 index 0000000..02734c6 --- /dev/null +++ b/src/main/java/db/leetcode1965/Solution.sql @@ -0,0 +1,13 @@ +-- 1965. 丢失信息的雇员 +-- https://leetcode.cn/problems/employees-with-missing-information/ +-- yangyi 2022年08月17日17:24:49 +select e.employee_id as employee_id +from Employees as e +left join Salaries as s on e.employee_id = s.employee_id +where s.salary is null +union +select s.employee_id as employee_id +from Salaries as s +left join Employees as e on s.employee_id = e.employee_id +where e.name is null +order by employee_id \ No newline at end of file diff --git a/src/main/java/db/leetcode197/Solution.sql b/src/main/java/db/leetcode197/Solution.sql new file mode 100644 index 0000000..1ca8c3a --- /dev/null +++ b/src/main/java/db/leetcode197/Solution.sql @@ -0,0 +1,6 @@ +-- 197. 上升的温度 +-- https://leetcode.cn/problems/rising-temperature/ +-- yangyi 2022年08月12日18:30:44 +select w1.id from Weather as w1, Weather as w2 +where datediff(w1.recordDate, w2.recordDate) = 1 +and w1.temperature> w2.temperature \ No newline at end of file diff --git a/src/main/java/db/leetcode511/Solution.sql b/src/main/java/db/leetcode511/Solution.sql new file mode 100644 index 0000000..ee8d806 --- /dev/null +++ b/src/main/java/db/leetcode511/Solution.sql @@ -0,0 +1,5 @@ +-- 511. 游戏玩法分析 I +-- https://leetcode.cn/problems/game-play-analysis-i/ +-- yangyi 2022年08月12日18:39:29 +select player_id, min(event_date) as first_login from Activity +group by player_id \ No newline at end of file diff --git a/src/main/java/db/leetcode584/Solution.sql b/src/main/java/db/leetcode584/Solution.sql new file mode 100644 index 0000000..088ac74 --- /dev/null +++ b/src/main/java/db/leetcode584/Solution.sql @@ -0,0 +1,6 @@ +-- 584. 寻找用户推荐人 +-- https://leetcode.cn/problems/find-customer-referee/ +-- yangyi 2022年08月15日11:28:30 +select name from customer +where referee_id 2 +or referee_id is null \ No newline at end of file diff --git a/src/main/java/db/leetcode586/Solution.sql b/src/main/java/db/leetcode586/Solution.sql new file mode 100644 index 0000000..e41e60c --- /dev/null +++ b/src/main/java/db/leetcode586/Solution.sql @@ -0,0 +1,8 @@ +-- 586. 订单最多的客户 +-- https://leetcode.cn/problems/customer-placing-the-largest-number-of-orders/ +-- yangyi 2022年08月15日16:54:27 +select customer_number +from Orders +group by customer_number +order by count(customer_number) DESC +limit 1 \ No newline at end of file diff --git a/src/main/java/db/leetcode595/Solution.sql b/src/main/java/db/leetcode595/Solution.sql new file mode 100644 index 0000000..aa418ee --- /dev/null +++ b/src/main/java/db/leetcode595/Solution.sql @@ -0,0 +1,6 @@ +-- 595. 大的国家 +-- https://leetcode.cn/problems/big-countries/ +-- yangyi 2022年08月15日11:33:36 +select name, population, area from World +where area>= 3000000 +or population>= 25000000 \ No newline at end of file diff --git a/src/main/java/db/leetcode596/Solution.sql b/src/main/java/db/leetcode596/Solution.sql new file mode 100644 index 0000000..5ea08b8 --- /dev/null +++ b/src/main/java/db/leetcode596/Solution.sql @@ -0,0 +1,7 @@ +-- 596. 超过5名学生的课 +-- https://leetcode.cn/problems/classes-more-than-5-students/ +-- yangyi 2022年08月15日17:30:01 +select class +from Courses +group by class +having count(class)>= 5 \ No newline at end of file diff --git a/src/main/java/db/leetcode607/Solution.sql b/src/main/java/db/leetcode607/Solution.sql new file mode 100644 index 0000000..cd6e7ce --- /dev/null +++ b/src/main/java/db/leetcode607/Solution.sql @@ -0,0 +1,8 @@ +-- 607. 销售员 +-- https://leetcode.cn/problems/sales-person/ +-- yangyi 2022年08月16日14:46:18 +select SalesPerson.name +from SalesPerson +where sales_id not in (select sales_id +from Orders as o +left join Company as c on o.com_id = c.com_id where c.name = 'RED') \ No newline at end of file diff --git a/src/main/java/db/leetcode608/Solution.sql b/src/main/java/db/leetcode608/Solution.sql new file mode 100644 index 0000000..31504fd --- /dev/null +++ b/src/main/java/db/leetcode608/Solution.sql @@ -0,0 +1,11 @@ +-- 608. 树节点 +-- https://leetcode.cn/problems/tree-node/ +-- yangyi 2022年08月16日15:04:09 +select id, +case +when id = (select id from tree where p_id is null) then 'Root' +when id in (select p_id from tree) then 'Inner' +else 'Leaf' +end as Type +from tree +order by id \ No newline at end of file diff --git a/src/main/java/db/leetcode620/Solution.sql b/src/main/java/db/leetcode620/Solution.sql new file mode 100644 index 0000000..9f85a5c --- /dev/null +++ b/src/main/java/db/leetcode620/Solution.sql @@ -0,0 +1,8 @@ +-- 620. 有趣的电影 +-- https://leetcode.cn/problems/not-boring-movies/ +-- yangyi 2022年08月15日17:08:21 +select * +from cinema +where description 'boring' +and mod(id, 2) 0 +order by rating DESC \ No newline at end of file diff --git a/src/main/java/db/leetcode626/Solution.sql b/src/main/java/db/leetcode626/Solution.sql new file mode 100644 index 0000000..c34f74b --- /dev/null +++ b/src/main/java/db/leetcode626/Solution.sql @@ -0,0 +1,13 @@ +-- 626. 换座位 +-- https://leetcode.cn/problems/exchange-seats/ +-- yangyi 2022年08月16日15:36:25 +# Write your MySQL query statement below +select +case +when mod(id, 2) 0 and counts id then id + 1 +when mod(id, 2) 0 and counts = id then id +when mod(id, 2) = 0 then id - 1 +end as id, student +from Seat, +(select count(id) as counts from Seat) as Seat_counts +order by id \ No newline at end of file diff --git a/src/main/java/db/leetcode627/Solution.sql b/src/main/java/db/leetcode627/Solution.sql new file mode 100644 index 0000000..a224188 --- /dev/null +++ b/src/main/java/db/leetcode627/Solution.sql @@ -0,0 +1,9 @@ +-- 627. 变更性别 +-- https://leetcode.cn/problems/swap-salary/ +-- yangyi 2022年08月15日16:29:47 +update Salary +set sex = +case +when sex = 'm' then 'f' +else 'm' +end \ No newline at end of file diff --git a/src/main/java/ds/LevelPrint.java b/src/main/java/ds/LevelPrint.java index 4c7766c..248233e 100644 --- a/src/main/java/ds/LevelPrint.java +++ b/src/main/java/ds/LevelPrint.java @@ -1,6 +1,6 @@ package ds; -import ds.bst.BinarySearchTree; +import ds.bst.base.BinarySearchTree; import java.util.ArrayDeque; import java.util.HashSet; diff --git a/src/main/java/ds/TopKFrequent.java b/src/main/java/ds/TopKFrequent.java deleted file mode 100644 index 2f95916..0000000 --- a/src/main/java/ds/TopKFrequent.java +++ /dev/null @@ -1,68 +0,0 @@ -package ds; - -import java.util.*; - -/** - * 前K个高频元素 - *

- * 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。 - *

- * 示例 1: - *

- * 输入: nums = [1,1,1,2,2,3], k = 2 - * 输出: [1,2] - * 示例 2: - *

- * 输入: nums = [1], k = 1 - * 输出: [1] - * 说明: - *

- * 你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。 - * 你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。 - * - * @author yangyi 2019年02月17日23:40:36 - */ -public class TopKFrequent { - - public List topKFrequent(int[] nums, int k) { - Map map = new HashMap(); - for (int i = 0; i < nums.length; i++) { - if (!map.containsKey(nums[i])) { - map.put(nums[i], 1); - } else { - map.put(nums[i], map.get(nums[i]) + 1); - } - } - //按照get出来的元素对应的次数排序 - PriorityQueue priorityQueue = new PriorityQueue(k, - new Comparator() { - @Override - public int compare(Integer o1, Integer o2) { - return map.get(o1).compareTo(map.get(o2)); - } - }); - //将元素加入小顶堆 - for (Map.Entry integerIntegerEntry : map.entrySet()) { - if (priorityQueue.size() < k) { - priorityQueue.offer(integerIntegerEntry.getKey()); - } else if (integerIntegerEntry.getValue()> map.get(priorityQueue.peek())) { - //比较元素出现的次数,如果次数比小顶堆的堆顶大,则取而代之,自己做堆顶 - priorityQueue.poll(); - priorityQueue.offer(integerIntegerEntry.getKey()); - } - } - List list = new ArrayList(k); - list.addAll(priorityQueue); - return list; - } - - public static void main(String[] args) { - int[] a = {1, 1, 1, 2, 2, 3}; - int[] b = {1}; - int[] c = {4, 1, -1, 2, -1, 2, 3}; - TopKFrequent topKFrequent = new TopKFrequent(); - System.out.println(Arrays.toString(topKFrequent.topKFrequent(a, 2).toArray())); - System.out.println(Arrays.toString(topKFrequent.topKFrequent(b, 1).toArray())); - System.out.println(Arrays.toString(topKFrequent.topKFrequent(c, 2).toArray())); - } -} diff --git a/src/main/java/ds/bfs/leetcode111/Solution.java b/src/main/java/ds/bfs/leetcode111/Solution.java index c4e96a9..7973cc2 100644 --- a/src/main/java/ds/bfs/leetcode111/Solution.java +++ b/src/main/java/ds/bfs/leetcode111/Solution.java @@ -48,7 +48,7 @@ public int minDepth(TreeNode root) { return 0; } Queue

treeNodeQueue = new LinkedList(); - treeNodeQueue.add(root); + treeNodeQueue.offer(root); int minDepth = 1; while (!treeNodeQueue.isEmpty()) { int size = treeNodeQueue.size(); @@ -58,10 +58,10 @@ public int minDepth(TreeNode root) { return minDepth; } if (cur.left != null) { - treeNodeQueue.add(cur.left); + treeNodeQueue.offer(cur.left); } if (cur.right != null) { - treeNodeQueue.add(cur.right); + treeNodeQueue.offer(cur.right); } } minDepth++; diff --git a/src/main/java/ds/bfs/leetcode117/Solution.java b/src/main/java/ds/bfs/leetcode117/Solution.java index 9b02807..162e811 100644 --- a/src/main/java/ds/bfs/leetcode117/Solution.java +++ b/src/main/java/ds/bfs/leetcode117/Solution.java @@ -1,6 +1,9 @@ package ds.bfs.leetcode117; +import java.util.ArrayDeque; +import java.util.Arrays; import java.util.LinkedList; +import java.util.List; import java.util.Queue; /** @@ -57,4 +60,51 @@ public Node connect(Node root) { } return root; } + + private Node createTree() { + Node node_1 = new Node(1); + Node node_2 = new Node(2); + Node node_3 = new Node(3); + Node node_4 = new Node(4); + Node node_5 = new Node(5); + Node node_7 = new Node(7); + node_1.left = node_2; + node_1.right = node_3; + node_2.left = node_4; + node_2.right = node_5; + node_3.right = node_7; + return node_1; + } + + private List levelOrder(Node root) { + if (root == null) { + return new LinkedList(); + } + List result = new LinkedList(); + Queue queue = new ArrayDeque(); + queue.offer(root); + while (!queue.isEmpty()) { + int size = queue.size(); + for (int i = 0; i < size; i++) { + Node cur = queue.poll(); + if (cur != null) { + result.add(cur.val); + } + if (cur.left != null) { + queue.offer(cur.left); + } + if (cur.right != null) { + queue.offer(cur.right); + } + } + } + return result; + } + + public static void main(String[] args) { + Solution solution = new Solution(); + Node root = solution.createTree(); + Node result = solution.connect(root); + System.out.println(Arrays.toString(solution.levelOrder(result).stream().mapToInt(value -> value).toArray())); + } } diff --git a/src/main/java/ds/bfs/targetoffer32/Solution.java b/src/main/java/ds/bfs/targetoffer32/Solution.java new file mode 100644 index 0000000..b18c2d4 --- /dev/null +++ b/src/main/java/ds/bfs/targetoffer32/Solution.java @@ -0,0 +1,67 @@ +package ds.bfs.targetoffer32; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +/** + * 从上到下打印二叉树 + * 剑指 Offer 32 - I. https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/ + * + * @author yangyi 2021年04月30日17:43:21 + */ +public class Solution { + + public class TreeNode { + int val; + TreeNode left; + TreeNode right; + + TreeNode(int x) { + val = x; + } + } + + public int[] levelOrder(TreeNode root) { + if (root == null) { + return new int[]{}; + } + Queue
queue = new LinkedList(); + queue.offer(root); + List
levelList = new LinkedList(); + while (!queue.isEmpty()) { + int size = queue.size(); + for (int i = 0; i < size; i++) { + TreeNode cur = queue.poll(); + if (cur != null) { + levelList.add(cur); + } + if (cur.left != null) { + queue.add(cur.left); + } + if (cur.right != null) { + queue.add(cur.right); + } + } + } + return levelList.stream().mapToInt(value -> value.val).toArray(); + } + + private TreeNode createTree() { + TreeNode node_3 = new TreeNode(3); + TreeNode node_9 = new TreeNode(9); + TreeNode node_20 = new TreeNode(20); + TreeNode node_15 = new TreeNode(15); + TreeNode node_7 = new TreeNode(7); + node_3.left = node_9; + node_3.right = node_20; + node_20.left = node_15; + node_20.right = node_7; + return node_3; + } + + public static void main(String[] args) { + System.out.println(Arrays.toString(new Solution().levelOrder(new Solution().createTree()))); + } +} diff --git a/src/main/java/ds/binary/MySqrt.java b/src/main/java/ds/binary/MySqrt.java deleted file mode 100644 index a41512a..0000000 --- a/src/main/java/ds/binary/MySqrt.java +++ /dev/null @@ -1,53 +0,0 @@ -package ds.binary; - -/** - * 实现 int sqrt(int x) 函数。 - *

- * 计算并返回 x 的平方根,其中 x 是非负整数。 - *

- * 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 - *

- * 示例 1: - *

- * 输入: 4 - * 输出: 2 - * 示例 2: - *

- * 输入: 8 - * 输出: 2 - * 说明: 8 的平方根是 2.82842..., - * 由于返回类型是整数,小数部分将被舍去。 - * - * @author yangyi 2019年01月29日22:12:30 - */ -public class MySqrt { - - public int mySqrt(int x) { - if (x == 0 || x == 1) { - return x; - } - int start = 0; - int end = x; - int result = 0; - while (start <= end) { - int m = start + ((end - start)>> 1); - if (m < x / m) { - start = m + 1; - //因为了开平方根取整数,有可能真正的结果比实际的算术结果小,所以要及时记录且返回 - result = m; - } else if (m> x / m) { - end = m - 1; - } else { - return m; - } - } - return result; - } - - public static void main(String[] args) { - MySqrt mySqrt = new MySqrt(); - int x = 8; - System.out.println(x + "的二次根号为:" + mySqrt.mySqrt(x)); - } - -} diff --git a/src/main/java/ds/binary/leetcode153/Solution.java b/src/main/java/ds/binary/leetcode153/Solution.java new file mode 100644 index 0000000..2651106 --- /dev/null +++ b/src/main/java/ds/binary/leetcode153/Solution.java @@ -0,0 +1,32 @@ +package ds.binary.leetcode153; + +/** + * 寻找旋转排序数组中的最小值 + * LeetCode 153. https://leetcode.cn/problems/find-minimum-in-rotated-sorted-array/ + * + * @author yangyi 2022年07月12日18:29:48 + */ +public class Solution { + + public int findMin(int[] nums) { + int start = 0, end = nums.length - 1; + while (start < end) { + int middle = start + (end - start) / 2; + if (nums[middle] < nums[end]) { + end = middle; + } else if (nums[middle]> nums[end]) { + start = middle + 1; + } + } + if (start == end) { + return nums[start]; + } + return -1; + } + + public static void main(String[] args) { + System.out.println(new Solution().findMin(new int[]{3, 4, 5, 1, 2})); + System.out.println(new Solution().findMin(new int[]{4, 5, 6, 7, 0, 1, 2})); + System.out.println(new Solution().findMin(new int[]{11, 13, 15, 17})); + } +} diff --git a/src/main/java/ds/binary/leetcode162/Solution.java b/src/main/java/ds/binary/leetcode162/Solution.java new file mode 100644 index 0000000..7db5835 --- /dev/null +++ b/src/main/java/ds/binary/leetcode162/Solution.java @@ -0,0 +1,35 @@ +package ds.binary.leetcode162; + +/** + * 寻找峰值 + * 山脉数组的峰顶索引 + * 山峰数组的顶部 + * LeetCode 162. https://leetcode.cn/problems/find-peak-element/ + * LeetCode 852. https://leetcode.cn/problems/peak-index-in-a-mountain-array/ + * 剑指 Offer II 069. https://leetcode.cn/problems/B1IidL/ + * + * @author yangyi 2022年07月12日17:59:02 + */ +public class Solution { + + public int findPeakElement(int[] nums) { + int start = 0, end = nums.length - 1; + while (start < end) { + int middle = start + (end - start) / 2; + if (nums[middle]> nums[middle + 1]) { + end = middle; + } else { + start = middle + 1; + } + } + if (start == end) { + return start; + } + return -1; + } + + public static void main(String[] args) { + System.out.println(new Solution().findPeakElement(new int[]{1, 2, 3, 1})); + System.out.println(new Solution().findPeakElement(new int[]{1, 2, 1, 3, 5, 6, 4})); + } +} diff --git a/src/main/java/ds/binary/leetcode278/Solution.java b/src/main/java/ds/binary/leetcode278/Solution.java new file mode 100644 index 0000000..4f6b2f6 --- /dev/null +++ b/src/main/java/ds/binary/leetcode278/Solution.java @@ -0,0 +1,43 @@ +package ds.binary.leetcode278; + +/** + * 第一个错误的版本 + * LeetCode 278. https://leetcode.cn/problems/first-bad-version/ + * + * @author yangyi 2022年07月12日17:33:15 + */ +public class Solution { + + public int firstBadVersion(int n) { + int start = 0, end = n; + while (start < end) { + int middle = start + (end - start) / 2; + if (isBadVersion(middle)) { + end = middle; + } else { + start = middle + 1; + } + } + if (start == end && isBadVersion(start)) { + return start; + } + return -1; + } + + private boolean isBadVersion(int version) { + if (version == 3) { + return false; + } else if (version == 5) { + return true; + } else if (version == 4) { + return true; + } else { + return false; + } + } + + public static void main(String[] args) { + Solution solution = new Solution(); + System.out.println(solution.firstBadVersion(5)); + } +} diff --git a/src/main/java/ds/binary/leetcode33/Solution.java b/src/main/java/ds/binary/leetcode33/Solution.java new file mode 100644 index 0000000..2a3b497 --- /dev/null +++ b/src/main/java/ds/binary/leetcode33/Solution.java @@ -0,0 +1,47 @@ +package ds.binary.leetcode33; + +/** + * 搜索旋转排序数组 + * LeetCode 33. https://leetcode.cn/problems/search-in-rotated-sorted-array/ + * + * @author yangyi 2022年07月12日15:29:12 + */ +public class Solution { + + public int search(int[] nums, int target) { + int start = 0, end = nums.length - 1; + if (end == 0) { + return nums[end] == target ? end : -1; + } + while (start <= end) { + int middle = start + (end - start) / 2; + if (nums[middle] == target) { + return middle; + } + if (nums[start] <= nums[middle]) { + if (nums[start] <= target && target < nums[middle]) { + end = middle - 1; + } else { + start = middle + 1; + } + } else if (nums[start]> nums[middle]) { + if (nums[middle] < target && target <= nums[end]) { + start = middle + 1; + } else { + end = middle - 1; + } + } + } + return -1; + } + + public static void main(String[] args) { + System.out.println(new Solution().search(new int[]{4, 5, 6, 7, 0, 1, 2}, 0)); + System.out.println(new Solution().search(new int[]{4, 5, 6, 7, 0, 1, 2}, 3)); + System.out.println(new Solution().search(new int[]{1}, 0)); + System.out.println(new Solution().search(new int[]{1}, 1)); + System.out.println(new Solution().search(new int[]{1, 3}, 2)); + System.out.println(new Solution().search(new int[]{3, 1}, 0)); + System.out.println(new Solution().search(new int[]{5, 1, 3}, 3)); + } +} diff --git a/src/main/java/ds/binary/leetcode34/Solution.java b/src/main/java/ds/binary/leetcode34/Solution.java new file mode 100644 index 0000000..a72bfd0 --- /dev/null +++ b/src/main/java/ds/binary/leetcode34/Solution.java @@ -0,0 +1,51 @@ +package ds.binary.leetcode34; + +import java.util.Arrays; + +/** + * 在排序数组中查找元素的第一个和最后一个位置 + * LeetCode 34. https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/ + * + * @author yangyi 2022年07月12日18:50:04 + */ +public class Solution { + + public int[] searchRange(int[] nums, int target) { + if (nums == null || nums.length == 0) { + return new int[]{-1, -1}; + } + int left = 0, right = nums.length - 1; + while (left + 1 < right) { + int mid = left + (right - left) / 2; + if (nums[mid] == target) { + if (nums[left] == nums[right]) { + return new int[]{left, right}; + } else if (nums[left] != target) { + left++; + } else if (nums[right] != target) { + right--; + } + } else if (nums[mid] < target) { + left = mid; + } else { + right = mid; + } + } + if (nums[left] == target && nums[right] == target) { + return new int[]{left, right}; + } + if (nums[right] == target) { + return new int[]{right, right}; + } + if (nums[left] == target) { + return new int[]{left, left}; + } + return new int[]{-1, -1}; + } + + public static void main(String[] args) { + System.out.println(Arrays.toString(new Solution().searchRange(new int[]{5, 7, 7, 8, 8, 10}, 8))); + System.out.println(Arrays.toString(new Solution().searchRange(new int[]{5, 7, 7, 8, 8, 10}, 6))); + System.out.println(Arrays.toString(new Solution().searchRange(new int[]{}, 0))); + } +} diff --git a/src/main/java/ds/binary/leetcode374/Solution.java b/src/main/java/ds/binary/leetcode374/Solution.java new file mode 100644 index 0000000..b84cbe4 --- /dev/null +++ b/src/main/java/ds/binary/leetcode374/Solution.java @@ -0,0 +1,51 @@ +package ds.binary.leetcode374; + +/** + * 猜数字大小 + * LeetCode 374. https://leetcode.cn/problems/guess-number-higher-or-lower/ + * + * @author yangyi 2022年07月12日15:04:14 + */ +public class Solution { + + private final int pick; + + public Solution(int pick) { + this.pick = pick; + } + + public int guessNumber(int num) { + int start = 0, end = num; + while (start <= end) { + int middle = start + (end - start) / 2; + if (guess(middle) == 1) { + start = middle + 1; + } else if (guess(middle) == -1) { + end = middle - 1; + } else { + return middle; + } + } + return -1; + } + + /** + * Forward declaration of guess API. + * + * @param num your guess + * @return -1 if num is lower than the guess number + * 1 if num is higher than the guess number + * otherwise return 0 + * int guess(int num); + */ + private int guess(int num) { + return Integer.compare(pick, num); + } + + public static void main(String[] args) { + System.out.println(new Solution(6).guessNumber(10)); + System.out.println(new Solution(1).guessNumber(1)); + System.out.println(new Solution(1).guessNumber(2)); + System.out.println(new Solution(2).guessNumber(2)); + } +} diff --git a/src/main/java/ds/binary/leetcode69/Solution.java b/src/main/java/ds/binary/leetcode69/Solution.java new file mode 100644 index 0000000..b5253ec --- /dev/null +++ b/src/main/java/ds/binary/leetcode69/Solution.java @@ -0,0 +1,33 @@ +package ds.binary.leetcode69; + +/** + * x的平方根 + * LeetCode 69. https://leetcode.cn/problems/sqrtx/ + * + * @author yangyi 2022年07月12日14:16:11 + */ +public class Solution { + + public int mySqrt(int x) { + if (x == 0 || x == 1) { + return x; + } + int start = 0, end = x; + while (start <= end) { + int middle = start + (end - start) / 2; + if (middle < x / middle) { + start = middle + 1; + } else if (middle> x / middle) { + end = middle - 1; + } else { + return middle; + } + } + return end; + } + + public static void main(String[] args) { + System.out.println(new Solution().mySqrt(4)); + System.out.println(new Solution().mySqrt(8)); + } +} diff --git a/src/main/java/ds/binary/leetcode704/Solution.java b/src/main/java/ds/binary/leetcode704/Solution.java new file mode 100644 index 0000000..2222d2d --- /dev/null +++ b/src/main/java/ds/binary/leetcode704/Solution.java @@ -0,0 +1,31 @@ +package ds.binary.leetcode704; + +/** + * 二分查找 + * 二分查找的3个模板 https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2020/07/29/template_diagram.png + * LeetCode 704. https://leetcode.cn/problems/binary-search/ + * + * @author yangyi 2022年07月12日12:11:28 + */ +public class Solution { + + public int search(int[] nums, int target) { + int start = 0, end = nums.length - 1; + while (start <= end) { + int middle = start + (end - start) / 2; + if (nums[middle] < target) { + start = middle + 1; + } else if (nums[middle]> target) { + end = middle - 1; + } else { + return middle; + } + } + return -1; + } + + public static void main(String[] args) { + System.out.println(new Solution().search(new int[]{-1, 0, 3, 5, 9, 12}, 9)); + System.out.println(new Solution().search(new int[]{-1, 0, 3, 5, 9, 12}, 2)); + } +} diff --git a/src/main/java/ds/binary/targetofferII06/Solution.java b/src/main/java/ds/binary/targetofferII06/Solution.java new file mode 100644 index 0000000..9871be3 --- /dev/null +++ b/src/main/java/ds/binary/targetofferII06/Solution.java @@ -0,0 +1,32 @@ +package ds.binary.targetofferII06; + +import java.util.Arrays; + +/** + * 排序数组中两个数字之和 + * 剑指 Offer II 006 https://leetcode.cn/problems/kLl5u1/ + * + * @author yangyi 2022年07月11日22:55:07 + */ +public class Solution { + + public int[] twoSum(int[] numbers, int target) { + int start = 0, end = numbers.length - 1; + while (start < end) { + if (numbers[start] + numbers[end] < target) { + start++; + } else if (numbers[start] + numbers[end]> target) { + end--; + } else { + return new int[]{start, end}; + } + } + return new int[]{-1, -1}; + } + + public static void main(String[] args) { + System.out.println(Arrays.toString(new Solution().twoSum(new int[]{1, 2, 4, 6, 10}, 8))); + System.out.println(Arrays.toString(new Solution().twoSum(new int[]{2, 3, 4}, 6))); + System.out.println(Arrays.toString(new Solution().twoSum(new int[]{-1, 0}, -1))); + } +} diff --git a/src/main/java/ds/binary/targetofferII068/Solution.java b/src/main/java/ds/binary/targetofferII068/Solution.java new file mode 100644 index 0000000..e9e7ec3 --- /dev/null +++ b/src/main/java/ds/binary/targetofferII068/Solution.java @@ -0,0 +1,32 @@ +package ds.binary.targetofferII068; + +/** + * 查找插入位置 + * 剑指 Offer II 068. https://leetcode.cn/problems/N6YdxV/ + * + * @author yangyi 2021年01月15日16:35:55 + */ +public class Solution { + + public int searchInsert(int[] nums, int target) { + int start = 0, end = nums.length - 1; + while (start <= end) { + int middle = start + (end - start) / 2; + if (nums[middle] < target) { + start = middle + 1; + } else if (nums[middle]> target) { + end = middle - 1; + } else { + return middle; + } + } + return end + 1; + } + + public static void main(String[] args) { + System.out.println(new Solution().searchInsert(new int[]{1, 3, 5, 6}, 5)); + System.out.println(new Solution().searchInsert(new int[]{1, 3, 5, 6}, 2)); + System.out.println(new Solution().searchInsert(new int[]{1, 3, 5, 6}, 7)); + System.out.println(new Solution().searchInsert(new int[]{1, 3, 5, 6}, 0)); + } +} diff --git a/src/main/java/ds/bst/BSTreeLowestCommonAncestor.java b/src/main/java/ds/bst/BSTreeLowestCommonAncestor.java deleted file mode 100644 index 8ab34ae..0000000 --- a/src/main/java/ds/bst/BSTreeLowestCommonAncestor.java +++ /dev/null @@ -1,73 +0,0 @@ -package ds.bst; - -/** - * 二叉搜索树的最近公共祖先 - *

- *

- * 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 - *

- * 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。" - *

- * 例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5] - *

- *

- *

- *

- *

- * 示例 1: - *

- * 输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8 - * 输出: 6 - * 解释: 节点 2 和节点 8 的最近公共祖先是 6。 - * 示例 2: - *

- * 输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4 - * 输出: 2 - * 解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。 - *

- *

- * 说明: - *

- * 所有节点的值都是唯一的。 - * p、q 为不同节点且均存在于给定的二叉搜索树中。 - *

- * - * @author yangyi 2019年01月25日19:15:29 - */ -public class BSTreeLowestCommonAncestor { - - public BinarySearchTree.TreeNode lowestCommonAncestor(BinarySearchTree.TreeNode root, BinarySearchTree.TreeNode p, BinarySearchTree.TreeNode q) { - if (p.value < root.value && q.value < root.value) { - return lowestCommonAncestor( - root.left, - new BinarySearchTree.TreeNode(p.value), - new BinarySearchTree.TreeNode(q.value)); - } else if (p.value> root.value && q.value> root.value) { - return lowestCommonAncestor( - root.right, - new BinarySearchTree.TreeNode(p.value), - new BinarySearchTree.TreeNode(q.value)); - } else { - return root; - } - } - - private BinarySearchTree.TreeNode createTree() { - BinarySearchTree binarySearchTree = new BinarySearchTree(); - BinarySearchTree.TreeNode node = null; - int[] array = {6, 2, 8, 0, 4, 7, 9, 0, 0, 3, 5}; - for (int i : array) { - node = binarySearchTree.insert(i); - } - return node; - } - - public static void main(String[] args) { - BSTreeLowestCommonAncestor bsTreeLowestCommonAncestor = new BSTreeLowestCommonAncestor(); - BinarySearchTree.TreeNode resultNode = bsTreeLowestCommonAncestor.lowestCommonAncestor( - bsTreeLowestCommonAncestor.createTree(), - new BinarySearchTree.TreeNode(2), - new BinarySearchTree.TreeNode(8)); - System.out.println("输出结果为:" + resultNode.value); - } -} diff --git a/src/main/java/ds/bst/BinarySearchTree.java b/src/main/java/ds/bst/base/BinarySearchTree.java similarity index 99% rename from src/main/java/ds/bst/BinarySearchTree.java rename to src/main/java/ds/bst/base/BinarySearchTree.java index 57de066..8a357da 100644 --- a/src/main/java/ds/bst/BinarySearchTree.java +++ b/src/main/java/ds/bst/base/BinarySearchTree.java @@ -1,4 +1,4 @@ -package ds.bst; +package ds.bst.base; /** * 二叉查找树的插入、遍历、查找、删除 diff --git a/src/main/java/ds/bst/leetcode108/Solution.java b/src/main/java/ds/bst/leetcode108/Solution.java index ff4c24f..543aae8 100644 --- a/src/main/java/ds/bst/leetcode108/Solution.java +++ b/src/main/java/ds/bst/leetcode108/Solution.java @@ -1,5 +1,11 @@ package ds.bst.leetcode108; +import java.util.ArrayDeque; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + /** * 将有序数组转换为二叉搜索树 * LeetCode 108 https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/ @@ -45,7 +51,32 @@ private TreeNode bst(int[] nums, int start, int end) { return cur; } + private List

levelOrder(TreeNode root) { + if (root == null) { + return new LinkedList(); + } + List
result = new LinkedList(); + Queue
queue = new ArrayDeque(); + queue.offer(root); + while (!queue.isEmpty()) { + for (int i = 0; i < queue.size(); i++) { + TreeNode cur = queue.poll(); + if (cur != null) { + result.add(cur); + } + if (cur.left != null) { + queue.offer(cur.left); + } + if (cur.right != null) { + queue.offer(cur.right); + } + } + } + return result; + } + public static void main(String[] args) { - System.out.println(new Solution().sortedArrayToBST(new int[]{-10, -3, 0, 5, 9}).val); + List
result = new Solution().levelOrder(new Solution().sortedArrayToBST(new int[]{-10, -3, 0, 5, 9})); + System.out.println(Arrays.toString(result.stream().mapToInt(value -> value.val).toArray())); } } diff --git a/src/main/java/ds/bst/leetcode109/Solution.java b/src/main/java/ds/bst/leetcode109/Solution.java index 525ef34..11041e6 100644 --- a/src/main/java/ds/bst/leetcode109/Solution.java +++ b/src/main/java/ds/bst/leetcode109/Solution.java @@ -1,14 +1,19 @@ package ds.bst.leetcode109; +import java.util.ArrayDeque; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + /** * 有序链表转换二叉搜索树 * LeetCode 109 https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/ * - * @author yangyi 2021年05月02日14:50:14 + * @author yangyi 2022年04月22日11:49:00 */ public class Solution { - public class ListNode { + public static class ListNode { int val; ListNode next; @@ -69,4 +74,57 @@ private ListNode getLinkMiddle(ListNode start, ListNode end) { return slow; } + private List> levelOrder(TreeNode root) { + if (root == null) { + return new LinkedList(); + } + List> result = new LinkedList(); + Queue
queue = new ArrayDeque(); + queue.offer(root); + while (!queue.isEmpty()) { + int size = queue.size(); + List
level = new LinkedList(); + for (int i = 0; i < size; i++) { + TreeNode cur = queue.poll(); + if (cur != null) { + level.add(cur); + } + if (cur.left != null) { + queue.offer(cur.left); + } + if (cur.right != null) { + queue.offer(cur.right); + } + } + result.add(level); + } + return result; + } + + private ListNode createListNode() { + ListNode val_10 = new ListNode(-10); + ListNode val_3 = new ListNode(-3); + ListNode val_0 = new ListNode(0); + ListNode val_5 = new ListNode(5); + ListNode val_9 = new ListNode(9); + val_10.next = val_3; + val_3.next = val_0; + val_0.next = val_5; + val_5.next = val_9; + return val_10; + } + + public static void main(String[] args) { + Solution solution = new Solution(); + ListNode link = solution.createListNode(); + TreeNode tree = solution.sortedListToBST(link); + List> result = solution.levelOrder(tree); + for (List
treeNodes : result) { + for (TreeNode treeNode : treeNodes) { + System.out.print(treeNode.val + " "); + } + System.out.println(); + } + } + } diff --git a/src/main/java/ds/bst/KthSmallestInBST.java b/src/main/java/ds/bst/leetcode230/Solution.java similarity index 86% rename from src/main/java/ds/bst/KthSmallestInBST.java rename to src/main/java/ds/bst/leetcode230/Solution.java index db8a2ab..a61f98f 100644 --- a/src/main/java/ds/bst/KthSmallestInBST.java +++ b/src/main/java/ds/bst/leetcode230/Solution.java @@ -1,4 +1,4 @@ -package ds.bst; +package ds.bst.leetcode230; /** * 二叉搜索树中第K小的元素 @@ -6,7 +6,7 @@ * * @author yangyi 2019年02月10日10:34:52 */ -public class KthSmallestInBST { +public class Solution { public class TreeNode { int val; @@ -76,12 +76,12 @@ private void inOrder(TreeNode root) { } public static void main(String[] args) { - KthSmallestInBST kthSmallestInBST = new KthSmallestInBST(); - TreeNode root = kthSmallestInBST.createTreeNode(); + Solution solution = new Solution(); + TreeNode root = solution.createTreeNode(); System.out.println("中序遍历构造出来的第一棵树: "); - kthSmallestInBST.inOrder(root); + solution.inOrder(root); System.out.println(); System.out.println("搜索此树的第1个最小的元素: "); - System.out.println(kthSmallestInBST.kthSmallest(root, 1)); + System.out.println(solution.kthSmallest(root, 1)); } } diff --git a/src/main/java/ds/bst/leetcode235/Solution.java b/src/main/java/ds/bst/leetcode235/Solution.java new file mode 100644 index 0000000..431755f --- /dev/null +++ b/src/main/java/ds/bst/leetcode235/Solution.java @@ -0,0 +1,67 @@ +package ds.bst.leetcode235; + +/** + * 二叉搜索树的最近公共祖先 + * LeetCode 235 https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/submissions/ + * 剑指 Offer 68 - I https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian-lcof/ + * + * @author yangyi 2019年01月25日19:15:29 + */ +public class Solution { + + public static class TreeNode { + int val; + TreeNode left; + TreeNode right; + + TreeNode(int x) { + val = x; + } + } + + public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { + if (p.val < root.val && q.val < root.val) { + return lowestCommonAncestor( + root.left, + new TreeNode(p.val), + new TreeNode(q.val)); + } else if (p.val> root.val && q.val> root.val) { + return lowestCommonAncestor( + root.right, + new TreeNode(p.val), + new TreeNode(q.val)); + } else { + return root; + } + } + + private TreeNode createTree() { + TreeNode node_6 = new TreeNode(6); + TreeNode node_2 = new TreeNode(2); + TreeNode node_8 = new TreeNode(8); + TreeNode node_0 = new TreeNode(0); + TreeNode node_4 = new TreeNode(4); + TreeNode node_7 = new TreeNode(7); + TreeNode node_9 = new TreeNode(9); + TreeNode node_3 = new TreeNode(3); + TreeNode node_5 = new TreeNode(5); + node_6.left = node_2; + node_6.right = node_8; + node_2.left = node_0; + node_2.right = node_4; + node_4.left = node_3; + node_4.right = node_5; + node_8.left = node_7; + node_8.right = node_9; + return node_6; + } + + public static void main(String[] args) { + Solution solution = new Solution(); + TreeNode resultNode = solution.lowestCommonAncestor( + solution.createTree(), + new TreeNode(2), + new TreeNode(8)); + System.out.println("输出结果为:" + resultNode.val); + } +} diff --git a/src/main/java/ds/bst/BstDelete.java b/src/main/java/ds/bst/leetcode450/Solution.java similarity index 87% rename from src/main/java/ds/bst/BstDelete.java rename to src/main/java/ds/bst/leetcode450/Solution.java index 89433e6..e195596 100644 --- a/src/main/java/ds/bst/BstDelete.java +++ b/src/main/java/ds/bst/leetcode450/Solution.java @@ -1,4 +1,4 @@ -package ds.bst; +package ds.bst.leetcode450; /** * 删除二叉搜索树中的节点 @@ -6,7 +6,7 @@ * * @author yangyi 2020年12月05日16:11:25 */ -public class BstDelete { +public class Solution { public class TreeNode { int val; @@ -62,7 +62,11 @@ public TreeNode deleteNode(TreeNode root, int key) { if (root == null) { return null; } - if (root.val == key) { + if (root.val> key) { + root.left = deleteNode(root.left, key); + } else if (root.val < key) { + root.right = deleteNode(root.right, key); + } else if (root.val == key) { if (root.left == null) { return root.right; } @@ -74,10 +78,6 @@ public TreeNode deleteNode(TreeNode root, int key) { root.val = min.val; //删除右子树中找出来的最小值 root.right = deleteNode(root.right, min.val); - } else if (key < root.val) { - root.left = deleteNode(root.left, key); - } else { - root.right = deleteNode(root.right, key); } return root; } @@ -93,15 +93,15 @@ private TreeNode getMin(TreeNode root) { } public static void main(String[] args) { - BstDelete bstDelete = new BstDelete(); + Solution solution = new Solution(); System.out.println("构建一棵树"); - TreeNode root = bstDelete.createTree(); + TreeNode root = solution.createTree(); System.out.println("中序遍历构建好的树: "); - bstDelete.inOrder(root); + solution.inOrder(root); System.out.println(); System.out.println("删除树中值为3的节点: "); - TreeNode result = bstDelete.deleteNode(root, 3); + TreeNode result = solution.deleteNode(root, 3); System.out.println("中序遍历删除对应的3节点之后剩余的树: "); - bstDelete.inOrder(result); + solution.inOrder(result); } } diff --git a/src/main/java/ds/bst/leetcode501/Solution.java b/src/main/java/ds/bst/leetcode501/Solution.java index 05f15b9..58723d6 100644 --- a/src/main/java/ds/bst/leetcode501/Solution.java +++ b/src/main/java/ds/bst/leetcode501/Solution.java @@ -32,11 +32,11 @@ public int[] findMode(TreeNode root) { return new int[]{}; } search(root); - int[] res = new int[result.size()]; - for (int i = 0; i < result.size(); i++) { - res[i] = result.get(i); - } - return res; + // int[] res = new int[result.size()]; +// for (int i = 0; i < result.size(); i++) { +// res[i] = result.get(i); +// } + return result.stream().mapToInt(value -> value).toArray(); } private void search(TreeNode cur) { diff --git a/src/main/java/ds/bst/leetcode530/Solution.java b/src/main/java/ds/bst/leetcode530/Solution.java index 85f6e58..f7c4862 100644 --- a/src/main/java/ds/bst/leetcode530/Solution.java +++ b/src/main/java/ds/bst/leetcode530/Solution.java @@ -29,7 +29,7 @@ public class TreeNode { */ public int getMinimumDifference(TreeNode root) { inOrder(root); - if (result.size() < 2) { + if (result.size() <= 1) { return 0; } int min = Integer.MAX_VALUE; diff --git a/src/main/java/ds/bst/leetcode783/Solution.java b/src/main/java/ds/bst/leetcode783/Solution.java new file mode 100644 index 0000000..aa5d8e7 --- /dev/null +++ b/src/main/java/ds/bst/leetcode783/Solution.java @@ -0,0 +1,89 @@ +package ds.bst.leetcode783; + +import java.util.LinkedList; + +/** + * 二叉搜索树节点最小距离 + * LeetCode 783 https://leetcode-cn.com/problems/minimum-distance-between-bst-nodes/ + * + * @author yangyi 2022年04月19日16:20:47 + */ +public class Solution { + + public class TreeNode { + int val; + TreeNode left; + TreeNode right; + + TreeNode() { + } + + TreeNode(int val) { + this.val = val; + } + + TreeNode(int val, TreeNode left, TreeNode right) { + this.val = val; + this.left = left; + this.right = right; + } + } + + public LinkedList result = new LinkedList(); + + private void inOrder(TreeNode root) { + if (root == null) { + return; + } + inOrder(root.left); + result.add(root.val); + inOrder(root.right); + } + + public int minDiffInBST(TreeNode root) { + inOrder(root); + if (result.size() <= 1) { + return 0; + } + int min = Integer.MAX_VALUE; + for (int i = 1; i < result.size(); i++) { + min = Math.min(min, Math.abs(result.get(i) - result.get(i - 1))); + } + return min; + } + + private TreeNode createTree(){ + TreeNode node_4 = new TreeNode(4); + TreeNode node_2 = new TreeNode(2); + TreeNode node_6 = new TreeNode(6); + TreeNode node_1 = new TreeNode(1); + TreeNode node_3 = new TreeNode(3); + node_4.left = node_2; + node_4.right = node_6; + node_2.left = node_1; + node_2.right = node_3; + return node_4; + } + + private TreeNode createTree2(){ + TreeNode node_1 = new TreeNode(1); + TreeNode node_0 = new TreeNode(0); + TreeNode node_48 = new TreeNode(48); + TreeNode node_12 = new TreeNode(12); + TreeNode node_49 = new TreeNode(49); + node_1.left = node_0; + node_1.right = node_48; + node_48.left = node_12; + node_48.right = node_49; + return node_1; + } + + public static void main(String[] args) { + Solution solution = new Solution(); + TreeNode tree = solution.createTree(); + TreeNode tree2 = solution.createTree2(); + System.out.println(solution.minDiffInBST(tree)); + System.out.println(solution.minDiffInBST(tree2)); + } + +} diff --git a/src/main/java/ds/greedy/leetcode53/Solution.java b/src/main/java/ds/greedy/leetcode53/Solution.java index bd75eb4..cad8549 100644 --- a/src/main/java/ds/greedy/leetcode53/Solution.java +++ b/src/main/java/ds/greedy/leetcode53/Solution.java @@ -1,7 +1,5 @@ package ds.greedy.leetcode53; -import org.omg.CORBA.INTERNAL; - /** * 最大子序和 * LeetCode 53 https://leetcode-cn.com/problems/maximum-subarray/ diff --git a/src/main/java/ds/heap/leetcode347/Solution.java b/src/main/java/ds/heap/leetcode347/Solution.java new file mode 100644 index 0000000..7dd7b6b --- /dev/null +++ b/src/main/java/ds/heap/leetcode347/Solution.java @@ -0,0 +1,44 @@ +package ds.heap.leetcode347; + +import java.util.*; + +/** + * 前 K 个高频元素 + * LeetCode 347 https://leetcode-cn.com/problems/top-k-frequent-elements/ + * + * @author yangyi 2007月12日16:00:48git + */ +public class Solution { + + public int[] topKFrequent(int[] nums, int k) { + Map map = new LinkedHashMap(); + for (int i = 0; i < nums.length; i++) { + if (map.containsKey(nums[i])) { + map.put(nums[i], map.getOrDefault(nums[i], -1) + 1); + } else { + map.put(nums[i], 1); + } + } + PriorityQueue priorityQueue = new PriorityQueue( + k, Comparator.comparing(o -> map.getOrDefault(o, -1))); + for (Map.Entry kv : map.entrySet()) { + if (priorityQueue.size() < k) { + priorityQueue.offer(kv.getKey()); + } else if (kv.getValue()> map.getOrDefault(priorityQueue.peek(), -1)) { + priorityQueue.poll(); + priorityQueue.offer(kv.getKey()); + } + } + return priorityQueue.stream().mapToInt(value -> value).toArray(); + } + + public static void main(String[] args) { + int[] a = {1, 1, 1, 2, 2, 3}; + int[] b = {1}; + int[] c = {4, 1, -1, 2, -1, 2, 3}; + Solution solution = new Solution(); + System.out.println(Arrays.toString(solution.topKFrequent(a, 2))); + System.out.println(Arrays.toString(solution.topKFrequent(b, 1))); + System.out.println(Arrays.toString(solution.topKFrequent(c, 2))); + } +} diff --git a/src/main/java/ds/pointer/leetcode11/Solution.java b/src/main/java/ds/pointer/leetcode11/Solution.java new file mode 100644 index 0000000..a609946 --- /dev/null +++ b/src/main/java/ds/pointer/leetcode11/Solution.java @@ -0,0 +1,30 @@ +package ds.pointer.leetcode11; + +/** + * 盛最多水的容器 + * LeetCode 11 https://leetcode-cn.com/problems/container-with-most-water/ + * + * @author yangyi 2022年05月05日22:47:18 + */ +public class Solution { + + public int maxArea(int[] height) { + int result = 0, start = 0, end = height.length - 1; + while (start < end) { + int area = Math.min(height[start], height[end]) * (end - start); + result = Math.max(result, area); + //矮的边向内移动,因为整体的盛水面积是由矮的边所决定的 + if (height[start] < height[end]) { + start++; + } else { + end--; + } + } + return result; + } + + public static void main(String[] args) { + System.out.println(new Solution().maxArea(new int[]{1, 8, 6, 2, 5, 4, 8, 3, 7})); + System.out.println(new Solution().maxArea(new int[]{1, 1})); + } +} diff --git a/src/main/java/ds/pointer/leetcode141/Solution.java b/src/main/java/ds/pointer/leetcode141/Solution.java index 08e4edc..4cf529d 100644 --- a/src/main/java/ds/pointer/leetcode141/Solution.java +++ b/src/main/java/ds/pointer/leetcode141/Solution.java @@ -7,7 +7,7 @@ * 环形链表 * LeetCode 141 https://leetcode-cn.com/problems/linked-list-cycle/ * - * @author yangyi 2020年12月10日22:35:31 + * @author yangyi 2022年04月24日15:07:52 */ public class Solution { @@ -85,14 +85,16 @@ private boolean hasCycleSet(ListNode head) { public boolean hasCycle(ListNode head) { ListNode fast = head; ListNode slow = head; - while (fast != null && fast.next != null) { + while (true) { + if (fast == null || fast.next == null) { + return false; + } fast = fast.next.next; slow = slow.next; - if (fast == slow) { + if (slow == fast) { return true; } } - return false; } public static void main(String[] args) { diff --git a/src/main/java/ds/pointer/leetcode15/Solution.java b/src/main/java/ds/pointer/leetcode15/Solution.java index 6365916..0117fcb 100644 --- a/src/main/java/ds/pointer/leetcode15/Solution.java +++ b/src/main/java/ds/pointer/leetcode15/Solution.java @@ -22,28 +22,28 @@ public List> threeSum(int[] nums) { if (i> 0 && nums[i] == nums[i - 1]) { continue; } - int left = i + 1; - int right = nums.length - 1; - while (left < right) { - int threeSum = nums[i] + nums[left] + nums[right]; - if (threeSum < 0) { - left++; - } else if (threeSum> 0) { - right--; + int start = i + 1; + int end = nums.length - 1; + while (start < end) { + int sum = nums[i] + nums[start] + nums[end]; + if (sum < 0) { + start++; + } else if (sum> 0) { + end--; } else { - LinkedList res = new LinkedList(); - res.add(nums[i]); - res.add(nums[left]); - res.add(nums[right]); - result.add(res); - while (left < right && nums[left] == nums[left + 1]) { - left++; + List num = new LinkedList(); + num.add(nums[i]); + num.add(nums[start]); + num.add(nums[end]); + result.add(num); + while (start < end && nums[start] == nums[start + 1]) { + start++; } - while (left < right && nums[right] == nums[right - 1]) { - right--; + while (start < end && nums[end] == nums[end - 1]) { + end--; } - right--; - left++; + start++; + end--; } } } diff --git a/src/main/java/ds/pointer/leetcode167/Solution.java b/src/main/java/ds/pointer/leetcode167/Solution.java index 5b5f459..a648952 100644 --- a/src/main/java/ds/pointer/leetcode167/Solution.java +++ b/src/main/java/ds/pointer/leetcode167/Solution.java @@ -6,7 +6,7 @@ * 两数之和 II - 输入有序数组 * LeetCode 167 https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted/ * - * @author yangyi 2020年12月14日11:52:36 + * @author yangyi 2022年04月24日18:47:00 */ public class Solution { @@ -15,12 +15,12 @@ public int[] twoSum(int[] numbers, int target) { int end = numbers.length - 1; while (start < end) { int sum = numbers[start] + numbers[end]; - if (sum == target) { - return new int[]{start + 1, end + 1}; - } else if (sum < target) { + if (sum < target) { start++; } else if (sum> target) { end--; + } else if (sum == target) { + return new int[]{start + 1, end + 1}; } } return new int[]{-1, -1}; @@ -28,7 +28,7 @@ public int[] twoSum(int[] numbers, int target) { public static void main(String[] args) { int[] a = {2, 7, 11, 15}; - Solution twoSumII = new Solution(); - System.out.println(Arrays.toString(a) + "数组中和为9对应的数的索引为:" + Arrays.toString(twoSumII.twoSum(a, 9))); + Solution twoSum2 = new Solution(); + System.out.println(Arrays.toString(a) + "数组中和为9对应的数的索引为:" + Arrays.toString(twoSum2.twoSum(a, 9))); } } diff --git a/src/main/java/ds/pointer/leetcode18/Solution.java b/src/main/java/ds/pointer/leetcode18/Solution.java index bd590b9..27d35bf 100644 --- a/src/main/java/ds/pointer/leetcode18/Solution.java +++ b/src/main/java/ds/pointer/leetcode18/Solution.java @@ -15,7 +15,7 @@ public class Solution { public List> fourSum(int[] nums, int target) { Arrays.sort(nums); - List> result = new ArrayList(); + List> result = new LinkedList(); for (int i = 0; i < nums.length; i++) { if (i> 0 && nums[i] == nums[i - 1]) { continue; @@ -24,24 +24,29 @@ public List> fourSum(int[] nums, int target) { if (j> i + 1 && nums[j] == nums[j - 1]) { continue; } - int left = j + 1; - int right = nums.length - 1; - while (left < right) { - int fourSum = nums[i] + nums[j] + nums[left] + nums[right]; + int start = j + 1; + int end = nums.length - 1; + while (start < end) { + int fourSum = nums[i] + nums[j] + nums[start] + nums[end]; if (fourSum < target) { - left++; + start++; } else if (fourSum> target) { - right--; + end--; } else { - result.add(new LinkedList(Arrays.asList(nums[i], nums[j], nums[left], nums[right]))); - while (left < right && nums[left] == nums[left + 1]) { - left++; + List four = new LinkedList(); + four.add(nums[i]); + four.add(nums[j]); + four.add(nums[start]); + four.add(nums[end]); + result.add(four); + while (start < end && nums[start] == nums[start + 1]) { + start++; } - while (left < right && nums[right] == nums[right - 1]) { - right--; + while (start < end && nums[end] == nums[end - 1]) { + end--; } - left++; - right--; + start++; + end--; } } } diff --git a/src/main/java/ds/pointer/leetcode287/Solution.java b/src/main/java/ds/pointer/leetcode287/Solution.java index 8d3c0df..a0b44e1 100644 --- a/src/main/java/ds/pointer/leetcode287/Solution.java +++ b/src/main/java/ds/pointer/leetcode287/Solution.java @@ -9,8 +9,7 @@ public class Solution { public int findDuplicate(int[] nums) { - int slow = 0; - int fast = 0; + int slow = 0, fast = 0; slow = nums[slow]; fast = nums[nums[fast]]; while (slow != fast) { diff --git a/src/main/java/ds/pointer/leetcode42/Solution.java b/src/main/java/ds/pointer/leetcode42/Solution.java new file mode 100644 index 0000000..1a1f419 --- /dev/null +++ b/src/main/java/ds/pointer/leetcode42/Solution.java @@ -0,0 +1,35 @@ +package ds.pointer.leetcode42; + +/** + * 接雨水 + * LeetCode 42 https://leetcode-cn.com/problems/trapping-rain-water/ + * + * @author yangyi 2022年05月05日23:31:02 + */ +public class Solution { + + /** + * 左右指针两边高度的最大值中的较小的那个 - 当前高度 = 当前接水量 + */ + public int trap(int[] height) { + int result = 0, start = 0, end = height.length - 1; + int startMax = 0, endMax = 0; + while (start < end) { + startMax = Math.max(startMax, height[start]); + endMax = Math.max(endMax, height[end]); + if (height[start] < height[end]) { + result += Math.min(startMax, endMax) - height[start]; + start++; + } else { + result += Math.min(startMax, endMax) - height[end]; + end--; + } + } + return result; + } + + public static void main(String[] args) { + System.out.println(new Solution().trap(new int[]{0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1})); + System.out.println(new Solution().trap(new int[]{4, 2, 0, 3, 2, 5})); + } +} diff --git a/src/main/java/ds/pointer/leetcode80/Solution.java b/src/main/java/ds/pointer/leetcode80/Solution.java new file mode 100644 index 0000000..c20c450 --- /dev/null +++ b/src/main/java/ds/pointer/leetcode80/Solution.java @@ -0,0 +1,33 @@ +package ds.pointer.leetcode80; + +/** + * 删除有序数组中的重复项 II + * LeetCode 80 https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/ + * + * @author yangyi 2022年05月06日00:23:37 + */ +public class Solution { + + /** + * 起始位置相当于一个最多出现几次的【游标卡尺】 + */ + public int removeDuplicates(int[] nums) { + if (nums.length <= 2) { + return nums.length; + } + int fast = 2, slow = 2; + while (fast < nums.length) { + if (nums[slow - 2] != nums[fast]) { + nums[slow] = nums[fast]; + slow++; + } + fast++; + } + return slow; + } + + public static void main(String[] args) { + System.out.println(new Solution().removeDuplicates(new int[]{1, 1, 1, 2, 2, 3})); + System.out.println(new Solution().removeDuplicates(new int[]{0, 0, 1, 1, 1, 1, 2, 3, 3})); + } +} diff --git a/src/main/java/ds/pointer/leetcode876/Solution.java b/src/main/java/ds/pointer/leetcode876/Solution.java index 9f1183a..b7814fe 100644 --- a/src/main/java/ds/pointer/leetcode876/Solution.java +++ b/src/main/java/ds/pointer/leetcode876/Solution.java @@ -4,7 +4,7 @@ * 链表的中间节点 * LeetCode 876 https://leetcode-cn.com/problems/middle-of-the-linked-list/ * - * @author yangyi 2020年12月11日00:06:32 + * @author yangyi 2022年04月24日17:33:20 */ public class Solution { @@ -54,7 +54,10 @@ private ListNode createLink2() { public ListNode middleNode(ListNode head) { ListNode fast = head; ListNode slow = head; - while (fast != null && fast.next != null) { + while (true) { + if (fast == null || fast.next == null) { + break; + } fast = fast.next.next; slow = slow.next; } diff --git a/src/main/java/ds/pointer/leetcode905/Solution.java b/src/main/java/ds/pointer/leetcode905/Solution.java index fd44d70..d902d20 100644 --- a/src/main/java/ds/pointer/leetcode905/Solution.java +++ b/src/main/java/ds/pointer/leetcode905/Solution.java @@ -6,33 +6,30 @@ * 按奇偶排序数组 * LeetCode 905 https://leetcode-cn.com/problems/sort-array-by-parity/ * - * @author yangyi 2020年12月15日14:12:15 + * @author yangyi 2022年04月24日19:17:01 */ public class Solution { - public int[] sortArrayByParity(int[] A) { - if (A == null) { - return new int[]{}; - } - if (A.length == 0) { - return A; + public int[] sortArrayByParity(int[] nums) { + if (nums == null || nums.length == 0) { + return new int[]{0}; } int start = 0; - int end = A.length - 1; + int end = nums.length - 1; while (start < end) { - if (A[start] % 2 == 0) { + if (nums[start] % 2 == 0) { start++; continue; } - if (A[end] % 2 != 0) { + if (nums[end] % 2 != 0) { end--; continue; } - int temp = A[start]; - A[start] = A[end]; - A[end] = temp; + int temp = nums[start]; + nums[start] = nums[end]; + nums[end] = temp; } - return A; + return nums; } public static void main(String[] args) { diff --git a/src/main/java/ds/pointer/targetoffer22/Solution.java b/src/main/java/ds/pointer/targetoffer22/Solution.java index 5c933df..221e4c9 100644 --- a/src/main/java/ds/pointer/targetoffer22/Solution.java +++ b/src/main/java/ds/pointer/targetoffer22/Solution.java @@ -4,7 +4,7 @@ * 链表中倒数第k个节点 * LeetCode 剑指offer 22 https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/ * - * @author yangyi 2020年12月11日00:26:01 + * @author yangyi 2022年04月24日17:50:02 */ public class Solution { @@ -36,10 +36,14 @@ private ListNode createLink() { public ListNode getKthFromEnd(ListNode head, int k) { ListNode fast = head; ListNode slow = head; - while (k--> 0) { + while (k != 0) { fast = fast.next; + k--; } - while (fast != null) { + while (true) { + if (fast == null) { + break; + } fast = fast.next; slow = slow.next; } diff --git a/src/main/java/ds/stack/leetcode20/Solution.java b/src/main/java/ds/stack/leetcode20/Solution.java index be810c9..f2df444 100644 --- a/src/main/java/ds/stack/leetcode20/Solution.java +++ b/src/main/java/ds/stack/leetcode20/Solution.java @@ -23,7 +23,7 @@ public boolean isValid(String s) { return false; } else if (!stack.peek().equals(String.valueOf(s.charAt(i)))) { return false; - }else { + } else { stack.pop(); } } diff --git a/src/main/java/ds/tree/FlattenLink.java b/src/main/java/ds/tree/leetcode114/Solution.java similarity index 88% rename from src/main/java/ds/tree/FlattenLink.java rename to src/main/java/ds/tree/leetcode114/Solution.java index ddc8b13..4eac0ab 100644 --- a/src/main/java/ds/tree/FlattenLink.java +++ b/src/main/java/ds/tree/leetcode114/Solution.java @@ -1,12 +1,13 @@ -package ds.tree; +package ds.tree.leetcode114; /** * 将二叉树展开为链表 * LeetCode 114 https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list/ + * https://assets.leetcode.com/uploads/2021/01/14/flaten.jpg * * @author yangyi 2020年11月25日16:22:39 */ -public class FlattenLink { +public class Solution { public static class TreeNode { int val; @@ -93,14 +94,14 @@ private void preOrder(TreeNode root) { } public static void main(String[] args) { - FlattenLink flattenLink = new FlattenLink(); - TreeNode root = flattenLink.createTree(); + Solution solution = new Solution(); + TreeNode root = solution.createTree(); System.out.println("中序遍历创建完成的二叉树: "); - flattenLink.inOrder(root); + solution.inOrder(root); System.out.println(); System.out.println("将此二叉树拉平成为一个链表: "); - flattenLink.flatten(root); + solution.flatten(root); System.out.println("打印这条二叉树被拉平后生成的链表: "); - flattenLink.preOrder(root); + solution.preOrder(root); } } diff --git a/src/main/java/ds/tree/leetcode116/Solution.java b/src/main/java/ds/tree/leetcode116/Solution.java index 57c88d3..20c7dea 100644 --- a/src/main/java/ds/tree/leetcode116/Solution.java +++ b/src/main/java/ds/tree/leetcode116/Solution.java @@ -3,6 +3,7 @@ /** * 填充每个节点的下一个右侧节点指针 * LeetCode 116 https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/ + * eg: https://assets.leetcode.com/uploads/2019/02/14/116_sample.png * * @author yangyi 2020年11月25日11:10:04 */ diff --git a/src/main/java/ds/tree/leetcode222/Solution.java b/src/main/java/ds/tree/leetcode222/Solution.java index 89d40a9..1b11756 100644 --- a/src/main/java/ds/tree/leetcode222/Solution.java +++ b/src/main/java/ds/tree/leetcode222/Solution.java @@ -52,9 +52,9 @@ public int countNodes2(TreeNode root) { if (root == null) { return 0; } + int nodeNum = 0; Queue
queue = new LinkedList(); queue.offer(root); - int nodeNum = 0; while (!queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; i++) { diff --git a/src/main/java/ds/tree/leetcode222/TreeNodeCount.java b/src/main/java/ds/tree/leetcode222/TreeNodeCount.java index 0480d47..55cd204 100644 --- a/src/main/java/ds/tree/leetcode222/TreeNodeCount.java +++ b/src/main/java/ds/tree/leetcode222/TreeNodeCount.java @@ -63,8 +63,8 @@ public int countTree2(TreeNode root) { if (root == null) { return 0; } - Queue
queue = new LinkedList(); int count = 0; + Queue
queue = new LinkedList(); queue.offer(root); while (!queue.isEmpty()) { int size = queue.size(); diff --git a/src/main/java/ds/tree/SerializePostOrderTree.java b/src/main/java/ds/tree/leetcode297/postorder/Solution.java similarity index 90% rename from src/main/java/ds/tree/SerializePostOrderTree.java rename to src/main/java/ds/tree/leetcode297/postorder/Solution.java index 1223971..e791782 100644 --- a/src/main/java/ds/tree/SerializePostOrderTree.java +++ b/src/main/java/ds/tree/leetcode297/postorder/Solution.java @@ -1,4 +1,4 @@ -package ds.tree; +package ds.tree.leetcode297.postorder; import java.util.Arrays; import java.util.LinkedList; @@ -9,7 +9,7 @@ * * @author yangyi 2020年12月07日15:28:43 */ -public class SerializePostOrderTree { +public class Solution { public class TreeNode { int val; @@ -82,10 +82,10 @@ private void inOrder(TreeNode root) { public static void main(String[] args) { //Your Codec object will be instantiated and called as such: - SerializePostOrderTree create = new SerializePostOrderTree(); + Solution create = new Solution(); TreeNode root = create.createTree(); - SerializePostOrderTree ser = new SerializePostOrderTree(); - SerializePostOrderTree deser = new SerializePostOrderTree(); + Solution ser = new Solution(); + Solution deser = new Solution(); TreeNode ans = deser.deserialize(ser.serialize(root)); System.out.println("中序遍历输出序列化和反序列化之后的结果: "); create.inOrder(ans); diff --git a/src/main/java/ds/tree/SerializePreOrderTree.java b/src/main/java/ds/tree/leetcode297/preorder/Solution.java similarity index 91% rename from src/main/java/ds/tree/SerializePreOrderTree.java rename to src/main/java/ds/tree/leetcode297/preorder/Solution.java index baa90ad..365fed1 100644 --- a/src/main/java/ds/tree/SerializePreOrderTree.java +++ b/src/main/java/ds/tree/leetcode297/preorder/Solution.java @@ -1,4 +1,4 @@ -package ds.tree; +package ds.tree.leetcode297.preorder; import java.util.Arrays; import java.util.LinkedList; @@ -9,7 +9,7 @@ * * @author yangyi 2020年12月07日15:28:43 */ -public class SerializePreOrderTree { +public class Solution { public class TreeNode { int val; @@ -83,10 +83,10 @@ private void inOrder(TreeNode root) { public static void main(String[] args) { //Your Codec object will be instantiated and called as such: - SerializePreOrderTree create = new SerializePreOrderTree(); + Solution create = new Solution(); TreeNode root = create.createTree(); - SerializePreOrderTree ser = new SerializePreOrderTree(); - SerializePreOrderTree deser = new SerializePreOrderTree(); + Solution ser = new Solution(); + Solution deser = new Solution(); TreeNode ans = deser.deserialize(ser.serialize(root)); System.out.println("中序遍历输出序列化和反序列化之后的结果: "); create.inOrder(ans); diff --git a/src/main/java/ds/tree/leetcode404/Solution.java b/src/main/java/ds/tree/leetcode404/Solution.java index eab8074..7478278 100644 --- a/src/main/java/ds/tree/leetcode404/Solution.java +++ b/src/main/java/ds/tree/leetcode404/Solution.java @@ -3,6 +3,7 @@ /** * 左叶子之和 * LeetCode 404 https://leetcode-cn.com/problems/sum-of-left-leaves/ + * https://tva1.sinaimg.cn/large/e6c9d24ely1h19ol4nngyj20hy0jbgm5.jpg * * @author yangyi 2021年02月04日17:33:34 */ diff --git a/src/main/java/ds/tree/leetcode513/Solution.java b/src/main/java/ds/tree/leetcode513/Solution.java index d3d9ea3..3bfa5c0 100644 --- a/src/main/java/ds/tree/leetcode513/Solution.java +++ b/src/main/java/ds/tree/leetcode513/Solution.java @@ -7,7 +7,7 @@ * 找树左下角的值 * LeetCode 513 https://leetcode-cn.com/problems/find-bottom-left-tree-value/ * - * @author yangyi 2021年02月04日17:48:32 + * @author yangyi 2022年04月22日16:59:26 */ public class Solution { @@ -34,14 +34,14 @@ public int findBottomLeftValue(TreeNode root) { if (root == null) { return 0; } + int result = 0; Queue
queue = new LinkedList(); queue.offer(root); - int result = 0; while (!queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; i++) { TreeNode cur = queue.poll(); - if (i == 0) { + if (cur != null && i == 0) { result = cur.val; } if (cur.left != null) { diff --git a/src/main/java/ds/tree/leetcode617/Solution.java b/src/main/java/ds/tree/leetcode617/Solution.java index c1a0b57..cc97262 100644 --- a/src/main/java/ds/tree/leetcode617/Solution.java +++ b/src/main/java/ds/tree/leetcode617/Solution.java @@ -6,7 +6,7 @@ import java.util.Queue; /** - * 合并二叉树 + * 合并二叉树(二叉树相加) * LeetCode 617 https://leetcode-cn.com/problems/merge-two-binary-trees/ * * @author yangyi 2021年02月12日20:38:40 diff --git a/src/main/java/ds/bst/target54/Solution.java b/src/main/java/ds/tree/target54/Solution.java similarity index 84% rename from src/main/java/ds/bst/target54/Solution.java rename to src/main/java/ds/tree/target54/Solution.java index 8db9260..e5ffe4e 100644 --- a/src/main/java/ds/bst/target54/Solution.java +++ b/src/main/java/ds/tree/target54/Solution.java @@ -1,10 +1,10 @@ -package ds.bst.target54; +package ds.tree.target54; /** * 二叉搜索树的第k大节点 * 剑指 Offer 54 https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/ * - * @author yangyi 2021年05月02日00:06:06 + * @author yangyi 2022年04月22日17:44:46 */ public class Solution { @@ -22,21 +22,21 @@ public class TreeNode { public int kthLargest(TreeNode root, int k) { this.k = k; - inOrderReserve(root); + kthLargestHelper(root); return result; } - private void inOrderReserve(TreeNode cur) { - if (cur == null) { + public void kthLargestHelper(TreeNode root) { + if (root == null) { return; } - inOrderReserve(cur.right); + kthLargestHelper(root.right); k--; if (k == 0) { - result = cur.val; + result = root.val; return; } - inOrderReserve(cur.left); + kthLargestHelper(root.left); } private TreeNode createTree() { diff --git a/src/main/java/od/HJ1/Main.java b/src/main/java/od/HJ1/Main.java new file mode 100644 index 0000000..8b2c63d --- /dev/null +++ b/src/main/java/od/HJ1/Main.java @@ -0,0 +1,24 @@ +package od.HJ1; + +import java.util.Scanner; + +/** + * @author yangyi 2023年08月29日12:55:18 + */ +class Main { + + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + String str = in.nextLine(); + char[] chars = str.toCharArray(); + int count = 0; + for (int i = chars.length - 1; i>= 0; i--) { + if (chars[i] != ' ') { + count++; + } else { + break; + } + } + System.out.println(count); + } +} diff --git a/src/main/java/od/HJ10/Main.java b/src/main/java/od/HJ10/Main.java new file mode 100644 index 0000000..a0b1e3e --- /dev/null +++ b/src/main/java/od/HJ10/Main.java @@ -0,0 +1,25 @@ +package od.HJ10; + +import java.util.HashSet; +import java.util.Scanner; + +/** + * @author yangyi 2023年08月29日16:46:50 + */ +class Main { + + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + String str = in.nextLine(); + char[] chars = str.toCharArray(); + HashSet set = new HashSet(); + for (char aChar : chars) { + if (aChar> 0 && aChar < 127) { + if (!set.contains(aChar)) { + set.add(aChar); + } + } + } + System.out.println(set.size()); + } +} diff --git a/src/main/java/od/HJ106/Main.java b/src/main/java/od/HJ106/Main.java new file mode 100644 index 0000000..51bbfa3 --- /dev/null +++ b/src/main/java/od/HJ106/Main.java @@ -0,0 +1,27 @@ +package od.HJ106; + +import java.util.Scanner; + +/** + * @author yangyi 2023年08月29日18:40:12 + */ +class Main { + + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + String n = in.nextLine(); + int start = 0; + int end = n.length() - 1; + char[] chars = n.toCharArray(); + while (start < end) { + char temp = chars[start]; + chars[start] = chars[end]; + chars[end] = temp; + start++; + end--; + } + for (char aChar : chars) { + System.out.print(aChar); + } + } +} diff --git a/src/main/java/od/HJ11/Main.java b/src/main/java/od/HJ11/Main.java new file mode 100644 index 0000000..180049e --- /dev/null +++ b/src/main/java/od/HJ11/Main.java @@ -0,0 +1,27 @@ +package od.HJ11; + +import java.util.Scanner; + +/** + * @author yangyi 2023年08月29日16:58:35 + */ +class Main { + + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + String str = in.nextLine(); + char[] chars = str.toCharArray(); + int start = 0; + int end = chars.length - 1; + while (start < end) { + char temp = chars[start]; + chars[start] = chars[end]; + chars[end] = temp; + start++; + end--; + } + for (int i = 0; i < chars.length; i++) { + System.out.print(chars[i]); + } + } +} diff --git a/src/main/java/od/HJ12/Main.java b/src/main/java/od/HJ12/Main.java new file mode 100644 index 0000000..971784e --- /dev/null +++ b/src/main/java/od/HJ12/Main.java @@ -0,0 +1,27 @@ +package od.HJ12; + +import java.util.Scanner; + +/** + * @author yangyi 2023年08月29日16:58:35 + */ +class Main { + + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + String str = in.nextLine(); + char[] chars = str.toCharArray(); + int start = 0; + int end = chars.length - 1; + while (start < end) { + char temp = chars[start]; + chars[start] = chars[end]; + chars[end] = temp; + start++; + end--; + } + for (int i = 0; i < chars.length; i++) { + System.out.print(chars[i]); + } + } +} diff --git a/src/main/java/od/HJ13/Main.java b/src/main/java/od/HJ13/Main.java new file mode 100644 index 0000000..548c8f8 --- /dev/null +++ b/src/main/java/od/HJ13/Main.java @@ -0,0 +1,25 @@ +package od.HJ13; + +import java.util.Scanner; + +/** + * @author yangyi 2023年08月29日17:03:34 + */ +class Main { + + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + String str = in.nextLine(); + char[] chars = str.toCharArray(); + if (str.contains(" ")) { + String[] strs = str.split(" "); + for (int i = strs.length - 1; i>= 0; i--) { + System.out.print(strs[i] + " "); + } + } else { + for (char aChar : chars) { + System.out.print(aChar); + } + } + } +} diff --git a/src/main/java/od/HJ14/Main.java b/src/main/java/od/HJ14/Main.java new file mode 100644 index 0000000..ea2fbe6 --- /dev/null +++ b/src/main/java/od/HJ14/Main.java @@ -0,0 +1,25 @@ +package od.HJ14; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Scanner; + +/** + * @author yangyi 2023年08月29日17:12:31 + */ +class Main { + + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + int n = in.nextInt(); + ArrayList list = new ArrayList(); + for (int i = 0; i < n; i++) { + String str = in.next(); + list.add(str); + } + list.sort(Comparator.naturalOrder()); + for (String s : list) { + System.out.println(s); + } + } +} diff --git a/src/main/java/od/HJ15/Main.java b/src/main/java/od/HJ15/Main.java new file mode 100644 index 0000000..d8672af --- /dev/null +++ b/src/main/java/od/HJ15/Main.java @@ -0,0 +1,20 @@ +package od.HJ15; + +import java.util.Scanner; + +/** + * @author yangyi 2023年08月29日17:55:29 + */ +class Main { + + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + int n = in.nextInt(); + int count = 0; + while (n != 0) { + n = n & (n-1); + count++; + } + System.out.println(count); + } +} diff --git a/src/main/java/od/HJ2/Main.java b/src/main/java/od/HJ2/Main.java new file mode 100644 index 0000000..6b66e0e --- /dev/null +++ b/src/main/java/od/HJ2/Main.java @@ -0,0 +1,15 @@ +package od.HJ2; + +import java.util.Scanner; + +/** + * @author yangyi 2023年08月29日13:16:17 + */ +class Main { + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + String a = in.nextLine(); + String b = in.nextLine(); + System.out.println(a.length() - a.toLowerCase().replaceAll(b.toLowerCase(), "").length()); + } +} diff --git a/src/main/java/od/HJ3/Main.java b/src/main/java/od/HJ3/Main.java new file mode 100644 index 0000000..e4ae8e2 --- /dev/null +++ b/src/main/java/od/HJ3/Main.java @@ -0,0 +1,23 @@ +package od.HJ3; + +import java.util.Scanner; +import java.util.TreeSet; + +/** + * @author yangyi 2023年08月29日13:25:04 + */ +class Main { + + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + int n = in.nextInt(); + TreeSet result = new TreeSet(); + for (int i = 0; i < n; i++) { + result.add(in.nextInt()); + } + for (Integer integer : result) { + System.out.println(integer); + } + } + +} diff --git a/src/main/java/od/HJ4/Main.java b/src/main/java/od/HJ4/Main.java new file mode 100644 index 0000000..a36a8bd --- /dev/null +++ b/src/main/java/od/HJ4/Main.java @@ -0,0 +1,22 @@ +package od.HJ4; + +import java.util.Scanner; + +/** + * @author yangyi 2023年08月29日13:44:01 + */ +class Main { + + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + String str = in.nextLine(); + while (str.length()>= 8) { + System.out.println(str.substring(0, 8)); + str = str.substring(8); + } + if (str.length() < 8 && str.length()> 0) { + str += "00000000"; + System.out.println(str.substring(0, 8)); + } + } +} diff --git a/src/main/java/od/HJ5/Main.java b/src/main/java/od/HJ5/Main.java new file mode 100644 index 0000000..c75faa3 --- /dev/null +++ b/src/main/java/od/HJ5/Main.java @@ -0,0 +1,15 @@ +package od.HJ5; + +import java.util.Scanner; + +/** + * @author yangyi 2023年08月29日13:51:10 + */ +class Main { + + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + String str = in.nextLine(); + System.out.println(Integer.parseInt(str.substring(2), 16)); + } +} diff --git a/src/main/java/od/HJ6/Main.java b/src/main/java/od/HJ6/Main.java new file mode 100644 index 0000000..f523d40 --- /dev/null +++ b/src/main/java/od/HJ6/Main.java @@ -0,0 +1,24 @@ +package od.HJ6; + +import java.util.Scanner; + +/** + * @author yangyi 2023年08月29日15:33:05 + */ +class Main { + + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + long n = in.nextLong(); + long sqrt = (long) Math.sqrt(n); + for (int i = 2; i <= sqrt; i++) { + while (n % 2 == 0) { + n /= i; + System.out.println(i + " "); + } + } + if (n != 1) { + System.out.println(n + " "); + } + } +} diff --git a/src/main/java/od/HJ7/Main.java b/src/main/java/od/HJ7/Main.java new file mode 100644 index 0000000..0aab7e7 --- /dev/null +++ b/src/main/java/od/HJ7/Main.java @@ -0,0 +1,15 @@ +package od.HJ7; + +import java.util.Scanner; + +/** + * @author yangyi 2023年08月29日16:02:37 + */ +class Main { + + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + double n = in.nextDouble(); + System.out.println(Math.round(n)); + } +} diff --git a/src/main/java/od/HJ8/Main.java b/src/main/java/od/HJ8/Main.java new file mode 100644 index 0000000..526c071 --- /dev/null +++ b/src/main/java/od/HJ8/Main.java @@ -0,0 +1,29 @@ +package od.HJ8; + +import java.util.Map; +import java.util.Scanner; +import java.util.TreeMap; + +/** + * @author yangyi 2023年08月29日16:09:39 + */ +class Main { + + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + int n = in.nextInt(); + TreeMap tree = new TreeMap(); + for (int i = 0; i < n; i++) { + int key = in.nextInt(); + int value = in.nextInt(); + if (tree.containsKey(key)) { + tree.put(key, tree.getOrDefault(key, 0) + value); + } else { + tree.put(key, value); + } + } + for (Map.Entry integerIntegerEntry : tree.entrySet()) { + System.out.println(integerIntegerEntry.getKey() + " " + integerIntegerEntry.getValue()); + } + } +} diff --git a/src/main/java/od/HJ9/Main.java b/src/main/java/od/HJ9/Main.java new file mode 100644 index 0000000..a558479 --- /dev/null +++ b/src/main/java/od/HJ9/Main.java @@ -0,0 +1,24 @@ +package od.HJ9; + +import java.util.HashSet; +import java.util.Scanner; +import java.util.Set; + +/** + * @author yangyi 2023年08月29日16:18:51 + */ +class Main { + + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + String n = in.nextLine(); + char[] chars = n.toCharArray(); + Set set = new HashSet(); + for (int i = chars.length - 1; i>= 0; i--) { + if (!set.contains(chars[i])) { + set.add(chars[i]); + System.out.print(chars[i]); + } + } + } +} diff --git a/src/main/java/thread/leetcode1114/Foo2.java b/src/main/java/thread/leetcode1114/Foo2.java new file mode 100644 index 0000000..8ca9b82 --- /dev/null +++ b/src/main/java/thread/leetcode1114/Foo2.java @@ -0,0 +1,63 @@ +package thread.leetcode1114; + +import java.util.concurrent.Semaphore; + +/** + * 按序打印 + * LeetCode 1114 https://leetcode-cn.com/problems/print-in-order/ + * + * @author yangyi 2022年08月11日15:52:55 + */ +public class Foo2 { + + private Semaphore firstFinish = new Semaphore(0); + private Semaphore secondFinish = new Semaphore(0); + + public Foo2() { + + } + + public void first(Runnable printFirst) throws InterruptedException { + printFirst.run(); + firstFinish.release(); + } + + public void second(Runnable printSecond) throws InterruptedException { + firstFinish.acquire(); + printSecond.run(); + secondFinish.release(); + } + + public void third(Runnable printThird) throws InterruptedException { + secondFinish.acquire(); + printThird.run(); + } + + public static void main(String[] args) throws InterruptedException { + Foo2 foo2 = new Foo2(); + Runnable printFirst = () -> System.out.println("first"); + Runnable printSecond = () -> System.out.println("second"); + Runnable printThird = () -> System.out.println("third"); + new Thread(() -> { + try { + foo2.third(printThird); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }).start(); + new Thread(() -> { + try { + foo2.first(printFirst); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }).start(); + new Thread(() -> { + try { + foo2.second(printSecond); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }).start(); + } +} diff --git a/src/main/java/thread/leetcode1115/FooBar2.java b/src/main/java/thread/leetcode1115/FooBar2.java new file mode 100644 index 0000000..e532f76 --- /dev/null +++ b/src/main/java/thread/leetcode1115/FooBar2.java @@ -0,0 +1,56 @@ +package thread.leetcode1115; + +import java.util.concurrent.Semaphore; + +/** + * 交替打印FooBar + * LeetCode 1115 https://leetcode-cn.com/problems/print-foobar-alternately/ + * + * @author yangyi 2022年08月11日16:05:19 + */ +public class FooBar2 { + + private int n; + private Semaphore foo = new Semaphore(0); + private Semaphore bar = new Semaphore(0); + + public FooBar2(int n) { + this.n = n; + } + + public void foo(Runnable printFoo) throws InterruptedException { + for (int i = 0; i < n; i++) { + foo.acquire(); + // printFoo.run() outputs "foo". Do not change or remove this line. + printFoo.run(); + bar.release(); + } + } + + public void bar(Runnable printBar) throws InterruptedException { + for (int i = 0; i < n; i++) { + foo.release(); + bar.acquire(); + // printBar.run() outputs "bar". Do not change or remove this line. + printBar.run(); + } + } + + public static void main(String[] args) { + FooBar2 fooBar2 = new FooBar2(100); + new Thread(() -> { + try { + fooBar2.foo(() -> System.out.println("foo")); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }).start(); + new Thread(() -> { + try { + fooBar2.bar(() -> System.out.println("bar")); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }).start(); + } +} diff --git a/src/main/java/thread/leetcode1117/H2O.java b/src/main/java/thread/leetcode1117/H2O.java index 2dda103..e01e07e 100644 --- a/src/main/java/thread/leetcode1117/H2O.java +++ b/src/main/java/thread/leetcode1117/H2O.java @@ -6,29 +6,60 @@ * H2O 生成 * LeetCode 1117 https://leetcode-cn.com/problems/building-h2o/ * - * @author yangyi 2022年02月08日15:39:38 + * @author yangyi 2022年08月11日17:49:01 */ public class H2O { - private Semaphore semaphoreH,semaphoreO; + private Semaphore h = new Semaphore(2); + private Semaphore o = new Semaphore(0); public H2O() { - semaphoreH = new Semaphore(2); - semaphoreO = new Semaphore(0); + } public void hydrogen(Runnable releaseHydrogen) throws InterruptedException { - semaphoreH.acquire(); + h.acquire(); // releaseHydrogen.run() outputs "H". Do not change or remove this line. releaseHydrogen.run(); - semaphoreO.release(); + o.release(); } public void oxygen(Runnable releaseOxygen) throws InterruptedException { - semaphoreO.acquire(2); + o.acquire(2); // releaseOxygen.run() outputs "O". Do not change or remove this line. releaseOxygen.run(); - semaphoreH.release(2); + h.release(2); + } + + public static void main(String[] args) { + Runnable h = () -> System.out.println("h"); + Runnable o = () -> System.out.println("o"); + int n = 3; + H2O h2O = new H2O(); + new Thread(new Runnable() { + @Override + public void run() { + try { + for (int i = 0; i < n * 2; i++) { + h2O.hydrogen(h); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }).start(); + new Thread(new Runnable() { + @Override + public void run() { + try { + for (int i = 0; i < n; i++) { + h2O.oxygen(o); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }).start(); } } diff --git a/src/main/java/thread/leetcode1226/DiningPhilosophers.java b/src/main/java/thread/leetcode1226/DiningPhilosophers.java new file mode 100644 index 0000000..6c7f5e6 --- /dev/null +++ b/src/main/java/thread/leetcode1226/DiningPhilosophers.java @@ -0,0 +1,34 @@ +package thread.leetcode1226; + +import java.util.concurrent.Semaphore; + +/** + * 哲学家进餐 + * LeetCode 1226 https://leetcode.cn/problems/the-dining-philosophers/ + * + * @author yangyi 2022年08月11日18:59:39 + */ +public class DiningPhilosophers { + + private Semaphore s = new Semaphore(1); + + public DiningPhilosophers() { + + } + + // call the run() method of any runnable to execute its code + public void wantsToEat(int philosopher, + Runnable pickLeftFork, + Runnable pickRightFork, + Runnable eat, + Runnable putLeftFork, + Runnable putRightFork) throws InterruptedException { + s.acquire(); + pickLeftFork.run(); + pickRightFork.run(); + eat.run(); + putLeftFork.run(); + putRightFork.run(); + s.release(); + } +} diff --git a/target/classes/ds/LevelPrint.class b/target/classes/ds/LevelPrint.class index 94d41ee..1b76dfc 100644 Binary files a/target/classes/ds/LevelPrint.class and b/target/classes/ds/LevelPrint.class differ diff --git a/target/classes/ds/MaxSlidingWindow.class b/target/classes/ds/MaxSlidingWindow.class deleted file mode 100644 index 3582fa6..0000000 Binary files a/target/classes/ds/MaxSlidingWindow.class and /dev/null differ diff --git a/target/classes/ds/binary/MySqrt.class b/target/classes/ds/binary/MySqrt.class deleted file mode 100644 index 2aac1e4..0000000 Binary files a/target/classes/ds/binary/MySqrt.class and /dev/null differ

AltStyle によって変換されたページ (->オリジナル) /