自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

非典型程序员

记录踩过的坑

  • 博客(35)
  • 收藏
  • 关注

原创 合并K个排序链表

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[1->4->5,1->3->4,2->6]输出: 1->1->2->3->4->4->5->6我的方案思路效率最差但是有效的暴力破解。算法先遍历参数ListNode数组的每一个链表,将链表每一个结点都放入新建的li...

2019-10-16 17:58:01 121

原创 数组中的第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我的方案代码class Solution { public int findKthLarges...

2019-10-14 17:39:40 920

原创 贪吃蛇(java实现)

这是严格遵循MVC模式的java练手项目,为了具备更高的自由性和可扩展性,这里只提供了游戏基本雏形,其他非必要的功能可以自行编写。

2019-10-11 18:01:25 3909 4

原创 下一个更大元素

给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出-1。示例 1:输入: nums1 = [4,1,2], nums2 = [1,3,4,2].输...

2019-10-10 17:26:44 106

原创 最小栈

设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。方法:push(x) – 将元素 x 推入栈中。pop() – 删除栈顶的元素。top() – 获取栈顶元素。getMin() – 检索栈中的最小元素。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);...

2019-10-10 15:57:17 2479 2

原创 找出数组中消失的数字

给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。不使用额外空间且时间复杂度为O(n)的情况下完成这个任务,假定返回的数组不算在额外空间内。示例:输入:[4,3,2,7,8,2,3,1]输出:[5,6]我的方案思路这里我是用了常规做法,使用哈...

2019-10-09 19:13:49 464 1

原创 第三大的数

给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。示例 1:输入: [3, 2, 1]输出: 1解释: 第三大的数是 1.示例 2:输入: [1, 2]输出: 2解释: 第三大的数不存在, 所以返回最大的数 2 .我的方案思路原本我使用了Arrays.sort()方法,但是这种堆排序的时间复杂度是O(nlogn)...

2019-10-09 18:02:50 91

原创 移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]我的方案思路将这道题分成三个步骤来做:数0的个数将非零元素赋值到集合中添0,并将集合赋值到数组中代码 public void moveZeroes(int[] nums){ int zeroCount...

2019-10-08 19:23:34 90

原创 旋转数组(环形替换)

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。示例 1:输入: [1,2,3,4,5,6,7] 和 k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]向右旋转 3 步: [5,6,7,1,2,3,4]示例 2:输入: [-1,-100,3,99] 和 ...

2019-09-30 17:48:10 3395 2

原创 求众数

给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在众数。示例 1:输入: [3,2,3]输出: 3示例 2:输入: [2,2,1,1,1,2,2]输出: 2我的方案思路题目要求找到众数,即为数组中重复次数最多的值。那么可以利用哈希表键唯一的特性,将重复次数作为键存储。算法建立哈希...

2019-09-28 17:45:27 567

原创 两数之和 II - 输入有序数组

给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例:输入: numbers = [2, 7, 11, 15], targe...

2019-09-28 16:48:10 438

原创 买卖股票的最佳时机

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。注意你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是...

2019-09-26 10:21:18 107

原创 反转链表二

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。说明:1 ≤ m ≤ n ≤ 链表长度。示例:输入: 1->2->3->4->5->NULL, m = 2, n = 4输出: 1->4->3->2->5->NULL官方方案(递归法)思路使用递归算法,给定m、n变量,每次递归时递减,当n=1时回溯。这样利...

2019-09-22 14:34:34 209

原创 c语言中fseek更新流遇到的问题

在学习C语言的IO章节时,有一道练习题是将当前文件中所有的’A’字符替换为’a’字符,这里我使用了fseek函数,发现出现无限循环的意外BUG,似乎牵扯到了C语言读写转换问题,如以下代码:#include<stdio.h>#include<stdlib.h> int main(){ FILE *fp; if ((fp = fopen("abc","r+")) =...

2019-09-21 16:14:34 559 3

原创 杨辉三角

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。示例:输入: 5输出:[[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]我的方案思路杨辉三角显然是上一行相对的左元素和右元素之和,那么循环到每一行加上上一行这两个值即可。这个题是属于动态规划的范畴,我这里没有使用临...

2019-09-19 15:06:04 2070 1

原创 合并两个有序数组

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n。你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。示例:输入:nums1 = [1,2,3,0,0,0], m = 3nums2 =...

2019-09-19 13:08:08 545

原创 加一

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例 1:输入: [1,2,3]输出: [1,2,4]解释: 输入数组表示数字 123。示例 2:输入: [4,3,2,1]输出: [4,3,2,2]解释: 输入数组表示数字 4321。我的方案思路...

2019-09-19 11:42:42 94

原创 最大子序和

定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。我的方案:思路一第一个想法是暴力破解,使用两个循环,第一个循环用来滑动起始索引,第二个循环用来滑动结束索引。代码class Solution { ...

2019-09-18 19:27:59 76

原创 串的堆分配实现

注意事项:在串的顺序存取中,一旦操作的串序列长度超过上界时,会采用截尾法处理,克服这个弊端可以使用动态分配串值得存储空间。堆分配——也是以一组地址连续的存储单元存放串值字符序列,但他们的存储空间是在程序运行过程中动态分配而得。一般对串操作时,多使用堆分配存储方式。#include<stdio.h>#include<string.h>#include<m...

2019-09-12 17:39:50 693

原创 串的定长顺序分配实现

注意事项:串是由零个或多个字符组成的有限序列。零个字符的串成为空串。串中任意个字符组成的子序列成为该串的子串。包含子串的串成为主串。通常称字符在序列中的序号为该字符在串中的位置。只有当两个串的长度和各个对应位置的字符都相等时,两串才相等。串的逻辑结构和线性表相似,但基本操作不同。串多以整体为操作对象,如查找子串、求取子串、在某个位置插入子串及删除。串的存储方法有:定长顺序存储、堆分配存储...

2019-09-12 17:38:37 401

原创 哈夫曼树实现

注意事项:哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的 路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的带权路径长度记为WPL = (W1*L1 + W2 * L2 + W3 * L3 + … + Wn * Ln),N个权值Wi(i = 1, 2, …n)构成一棵有N个叶结点的二叉树,相应的叶结...

2019-09-12 17:36:58 254

原创 树和森林实现

注意事项:树的表示方法分为:双亲表示法、孩子表示法、孩子兄弟表示法(二叉链表表示法),目前只涉及二叉链表(孩子兄弟)表示法的森林表示法。由于森林的二叉链表不知道孩子的数量,所以不能使用递归建立,而使用队列辅助建立。#include<stdio.h>#include<string.h>#include<malloc.h>#include<st...

2019-09-12 17:33:08 510 1

原创 线索二叉树实现

注意事项:二叉链表被线索化之后可以不需要使用栈来遍历链表,当先序遍历时没有左结点就访问右结点所指的后继。若在某程序中所用二叉树需经常遍历或查找结点在遍历所得线性序列中的前驱和后继,则应采用线索链表作为存储结构普通二叉链表不需要头结点,而线索二叉树需要,为了第一个结点指针有找落点,如果第一个指针和最后一个都指向头结点,即二叉树为空。由于线索二叉树是在遍历的过程中得到的,所以不同的遍历方法有...

2019-09-12 17:32:02 156

原创 非递归遍历二叉树实现

注意事项:先序非递归算法的思想:1.二叉树指针不为空时,根指针入栈,指针指向左孩子,并将根结点输出。如果二叉树指针为空,根指针出栈,指针指向右孩子。(每一次出栈后指针指向其右孩子,可以保证每一个左右结点都可以遍历到)后序遍历非递归算法:从根结点开始,将所有最左结点全部压栈,每当一个结点出栈时,都先扫描该结点的右子树,只有当一个结点的左孩子和右孩子结点均被访问过了,才能访问结点自身。后序遍历...

2019-09-12 17:30:15 1224 1

原创 二叉链表实现

注意事项:使用abcd###e##c#f## 来进行先序输入。或者最后两个为空格,否则会一直提示输入。重点关注层序遍历,因为其特性,所以需要一个队列数据结构来进行配合。结点拥有的子树数为结点的度,度为0的结点为叶子结点,树的度是树内各结点度的最大值,二叉树即度为二的树。树中结点的最大层次称为树的深度。出现半小时BUG:在创建函数定义中使用%d期待输入数字,但实际操作中输入了字母,会导致编...

2019-09-12 17:27:32 1431 2

原创 循环队列实现

注意事项:循环队列,是队列的顺序表示和实现。因为是尾进头出,所以和顺序栈不同的是需要将顺序队列臆造成一个环状的空间,以便在尾部添加满之后从头部空位开始插入。也可以使用数组队列,也就是不能动态增长的顺序队列,这样不需要每次取模最大值来构成环形空间。每次插入新的队列尾元素时,尾指针增1,每当删除队列头元素时,头指针增1。尾指针会出现在头指针之前,由此特性,循环队列在无法预估使用大小时,不宜使用...

2019-09-12 17:24:14 185

原创 链队列实现

注意事项:链队列需要设立一个结点结构体(指针域和数据域,与链表结点一样)和一个包含指向这个结构体的首和尾指针的结构体(因为需要一次传递两个参数,这个结构可以使得只需要传递一个参数)。但是先进先出=尾插头删与c++程序不同的是,c语言没有形参的&运算符,可以将在函数中改变的数值返回到变量中,所以只能定义指向链队列指针结构的指针。bug:注意结点结构体的自定义类型,这里出现了一个一小时...

2019-09-12 17:23:02 212

原创 顺序栈和链栈实现

注意事项:顺序栈:实现需要使用数组,数组的元素在内存中的存储位置是连续的;且需要知道数组的长度才可以使用;无法避免溢出问题;当系统给数组分配了内存空间,其他的任务是不能使用这个内存空间的;本算法中的顺序栈避免了溢出问题以及空间不能增长的缺陷,使用了动态分配的方法使用连续内存。存储密度 = 1;顺序栈的top指针指向的是栈顶的空元素处,top - 1才是指向栈顶元素;不易实现插入和删除...

2019-09-12 17:21:28 501

原创 双向链表实现

注意事项:双向链表的头结点的prior指向最后的结点。最后一个结点的next指向头结点在初始化链表时,前驱后继指针均指向头结点。双向链表是循环链表的一个扩充。但是使用的是头结点。#include<stdio.h>#include<stdlib.h>typedef struct DuLNode{ int data; struct DuLNode *pri...

2019-09-12 17:16:57 176

原创 循环链表实现

注意事项:循环链表设置尾指针。由于在链表的操作过程中,尾指针会不断变化,所以在一些函数的形参中都设置指向头指针的指针。以及链表的结束判断条件变成q是否等于尾指针。注意传递的实参需要取地址循环链表的优势在于双链表合并,以及实现尾插法简单(首先新建结点指向头结点,然后把尾指针的next域指向该新建结点)在创建链表时,使用尾插法,而不是用头插法(因为头插法很难去更新尾指针,使得最后尾指针还需额...

2019-09-12 17:15:41 757

原创 静态链表实现

注意事项:这里用k申请空间,i遍历空间。静态链表是利用游标来模拟指针,把固定分配的内存分成备用链表和链表两大块,在利用自制的malloc和free函数申请释放备用空间时,实现离散存储。基本操作和动态链表实际上差不多,不过一个是利用p = p->next一个是使用i = L[i].cur来实现指针的后移。初始化链表时,链表只有最后一个空间的cur是0, 意味是头指针,并没有任何分配的...

2019-09-12 17:14:24 293

原创 单链表实现

使用头结点的好处:插入删除等函数不需要额外考虑位于首结点的条件。一些改变链表的函数在传参时,如不改变头结点,可只传递普通头结点的指针,否则的话,需要传递首结点指针的指针来应对更改首结点地址的情况。#include<stdio.h>#include<stdlib.h>typedef struct Node//结点的存储结构{ int data; // s...

2019-09-12 17:11:49 144

原创 搜索插入位置(附二分法模板)

题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。我的方案:思路我把这个题分成两部分,第一部分是查询是否有这个数字,因为数组无重复,所以使用哈希表。第二部分是,查找这个数字应该插入的位置。算法先建立一个map集合,将数组的值作为键,数组的索引作为值。当查找不到值时,在数组中从头遍历比...

2019-09-12 16:43:26 207

原创 两数之和

题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。我的思路:遇到这个题,第一个想法就是暴力破解,使用双重循环遍历我的解法:java:class Solution { public int[] twoSum(int[] ...

2019-09-09 19:47:18 203

原创 使用tomcat免安装版出现的问题

1.解决双击startup.bat,看到一闪而过的情形。2.解决启动startup.bat后发现中文出现乱码的问题。

2019-07-10 23:05:56 323

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除