
java
逝水一战
重剑无锋,大巧不工
展开
-
IP地址和子网掩码的分类统计
一道特别恶心的字符串处理题。问题描述:请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。所有的IP地址划分为A,B,C,D,E五类A类地址1.0.0.0~126.255.255.255;B类地址128.0.0.0~191.255.255.255;C类地址192.0.0.0~223.255.255.255;D类地址224.0.0.0~239.255.255.255;E类地址240.0.0.0~255.255.255.2.原创 2020-06-19 20:45:51 · 410 阅读 · 0 评论 -
数组中第k大的元素
问题描述:在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/kth-largest-.原创 2020-06-05 16:58:53 · 286 阅读 · 0 评论 -
跳跃游戏
问题描述:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例1:输入: [2,3,1,1,4]输出: true解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。示例2:输入: [3,2,1,0,4]输出: false解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。..原创 2020-05-11 14:10:44 · 375 阅读 · 0 评论 -
快速求一整数的K次方(二分查找)
问题描述:给定一整数K,N,求出啊K的N次方。若两数相乘时间复杂度为O(1),要求整体时间复杂度为O(logN)。大体思路:可以将N转化为二进制形式,将K^N转化为K的二进制各项方的结果之积。例如K = 8,N = 70:N = 64 + 4 + 2 ;8^70 = 8^ 64 * 8 ^4 * 8^2;可以一次计算8^1,8^2,8^4 .......8^64各项,可以发现...原创 2019-11-17 09:57:27 · 539 阅读 · 0 评论 -
完全二叉树的结点个数(二分查找)
题目描述:给定一完全二叉树头结点,返回该二叉树的结点个数,要求时间复杂度为低于O(logN)。大体思路:由于该二叉树为完全二叉树,所以其的两个子树至少有一个是满二叉树。有如下两种情况:可以发现左边的二叉树的根结点的左子树为满二叉树,右根结点的右子树为满二叉树。那么如何判断二叉树属于以上哪种情况呢?可以用右子树高度来判断,若右子树的高度 = 整体高度 - 1则说明右子...原创 2019-11-16 21:18:36 · 752 阅读 · 1 评论 -
找整型不重复有序数组中到值等于下标的元素
问题描述:给定一有序、不含重复元素的整型数组arr,找到满足arr[i] == i中最小的元素。要求时间复杂度为O(logN).实现思路:由于下标的增长速度始终为一,而arr的增长速度恒大于等于一,可以利用这一点将搜索域逐步减半;对中间元素进行判断若大于其下标,则可知后半段是不存在满足题设条件的解的;若小于其下标,同理前半段无可行解;等于时,之后无可行解。如此便可以O(logN)的...原创 2019-11-16 19:37:53 · 330 阅读 · 1 评论 -
循环有序数组中最小元素的查找(二分查找)
问题描述:如题,其中循环有序数组指的是对有序数组进行循环移位后的结果,如[7,8,9,0,1,2,3,4,5,6];实现思路:由循环有序数组结构可知,若数组不为整体有序,则最小值一定是处于无序子序列之中,如上述例子中,最小值一定处于7到1之间,而一定不处于1到6之间,根据该性质可以得到如下算法:先进行判断该数组是否整体有序(arr[left] < arr[right]),若有...原创 2019-11-15 19:58:34 · 2044 阅读 · 1 评论 -
局部小值的查找(二分查找)
问题描述:给定一任意相邻元素不重复的无序数组,找到其中任意一个局部最小值。(注:局部最小值的定义为该位置的元素小于其左右两个元素,对于首元素,只需小于后一个,尾元素小于前一个即可)大体思路:先进行首尾元素判断,若为局部最小值返回即可,否则从两边出发的趋势为下降的。如下图:由上图可知left到right之间一定存在局部最小点。mid = left + (right - lef...原创 2019-11-15 17:34:52 · 511 阅读 · 0 评论 -
链表相交问题
问题描述:给定两链表的头结点,判断两链表是否存在公共部分(相交),若相交返回相交的第一个节点。经分析发现该问题可以分成如下两个子问题进行解决。子问题一:两无环链表是否相交算法一:假设list1长度为L1,list2长度为L2,假设公共部分长为m,由L1 + L2 - m = L2 + L1 -m可知第一路先遍历list1,再遍历list2,第二路先遍历list2再遍历list1,若...原创 2019-11-08 17:40:54 · 184 阅读 · 0 评论 -
有环链表判断
问题描述:判断链表是否有环,如若有环则返回其进入环的第一个节点。算法一:创建一个哈希表,遍历该链表过程中将判断该节点是否已存在于哈希表,如不存在则将其插入哈希表,存在则证明链表有环,并且该元素即为进入环的第一个节点;链表遍历过程中出现null则证明该链表无环。实现代码如下: public static Node<Integer> selution(Node...原创 2019-11-08 16:27:19 · 110 阅读 · 0 评论 -
二分查找(详尽版)
二分查找给定一有序的序列nums[],一个元素target,想要找到其中等于给定元素的下标。大体思路就是总是折半查找,通过比较给定元素与序列中间元素的大小,若nums[midIndex] > target,说明target的值在前半段,小于时在后半段。如此往复,即可得到结果。算法如此简单,但在具体实现过程中有些细节问题值得思考。如下就列出五种情况下的的二分查找。目录1.从nu...原创 2019-11-01 21:58:10 · 274 阅读 · 0 评论 -
按基准划分链表(分为三段)
问题描述:给定一个链表和一个特定值x,对链表进行分隔,使得所有小于x的节点放在前面,等于x的节点放在中间,大于x的结点放在后面。该问题为leetcode86分隔链表的加强版。实现思路:1.链表分隔首先定义三个小链表,遍历该链表,将小于x值的插到第一个链表后面,等于的插到第二个链表之后,大于的插入第三个链表后面。2.小表合并将这三个链表依次首位相连连成一个大链表...原创 2019-10-14 10:51:46 · 1255 阅读 · 0 评论 -
两两交换链表中的节点(Leetcode24)
题目:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:给定 1->2->3->4 你应该返回 2->1->4->3思路:很明显是一个递归问题,先将后面的N-2的结点完成,在此基础上完成第一个和第二个结点的交换。交换:第一个结点为p1,第二个为p2,p1.ne...原创 2019-05-26 15:09:04 · 170 阅读 · 0 评论 -
下一个排列(Leetcode31)
题目:实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。 1,2,3→1,3,2 3,2,1→1,2,3 1,1,5→1,5,1思路:从后往前遍历,...原创 2019-05-27 09:59:55 · 122 阅读 · 0 评论 -
三种时间复杂度为O(n^2)的排序算法
1.冒泡排序基本思想:依次比较相邻元素,若前面的大于后面的就交换元素,在一次迭代中将最大的元素“沉降”到最后的位置,经过n-1次迭代即可完成排序目的。 public static void bubbleSort(int[] data) { for(int i=0;i<data.length-1;i++) { boolean Bfinis...原创 2019-08-07 16:03:52 · 4715 阅读 · 0 评论 -
快速排序
基本思想:第一步:从序列中随机挑选一个元素作为主值第二步:将序列中小于该元素的值放到其左边,大于该元素的值放到其右边自此主值元素的最终位置确定,后续只需递归进行上述操作对其的左序列及右序列(注:左,右序列均不包括该元素)具体实现:先获得主值,将取到的主值放到序列最后。左区间用于存放比主值小的元素,其初始长度为0。遍历该序列先将不大于主值的元素交换到右区间的第一个位置,再对左区间...原创 2019-08-07 16:43:20 · 157 阅读 · 0 评论 -
归并排序(java描述)
大体思想:将长度为N的序列依次完成长度为1的有序序列,长度为2的有序序列.长度为4的有序序列...长度为N的有序序列,如下表所示:具体实现:具体是用递归方式实现的,其中递归中的关键一步为;若一个序列的左序列和右序列均已经排好序列,就将其合并。合并部分为借助一个与待合并序列长度之和的临时数组,首先利用双指针法将两个有序的子序列排好序放入临时数组中,然后将临时数组中的数据复制到原始...原创 2019-08-10 17:43:56 · 152 阅读 · 0 评论 -
队尾幸运编号
题目描述:N个人排成一队,从1到5轮流报数,报5的人是幸运者,出列。报到队尾后,从队首接着报,依次循环。输入N,输出队尾的人是第几名幸运者?例如:N=1,输出1N=2,输出2N=5,输出1N=8,输出3今天帮同学做这题,死活是想不出来,然而等笔试时间过了后,发现这nm这么明显的循环链表,当时楞是想不出来。大体思路:建立data从1->N,N长度的循环链...原创 2019-09-09 21:47:32 · 301 阅读 · 0 评论 -
先序中序重构二叉树
已知二叉树的先序遍历序列和中序遍历序列,重构出二叉树。算法简介:如上图所示的二叉树,其先序遍历序列为:a b d c e f 中序序列为:d b a e c f首先可以知道根结点为先序的第一个元素即 a ,(a b d c e f)再由中序序列可知对于根结点a 其中序序列的左子树为db 右子树为ecf (d b a e c f)接下来可以得到先序序列 左子树为bd 右子...原创 2019-10-11 16:53:22 · 423 阅读 · 0 评论 -
盛最多水的容器算法证明过程(LeetCode11)
题目:给定n个非负整数a1,a2,...,an,每个数代表坐标中的一个点(i,ai) 。在坐标内画n条垂直线,垂直线i的两个端点分别为(i,ai) 和 (i, 0)。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。算法:定义两个指针i,j(其初始位置i在头,j在尾)if(ai>aj) j--;else i++.最大的面积总是在i j之间。证明...原创 2019-05-01 19:13:28 · 657 阅读 · 0 评论