- 博客(41)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 Huffman 编码的实现(C语言)
Huffman 编码具体原理及定义请百度,下面直接进行实现。具体实现过程是: 统计若干字符出现的频率,将其按频率(权重)升序存放进队列中,每次从队列中取两个结点合成一颗二叉树,这两个结点的根节点是取出来两个结点的字符的权重和,并且将新的结点放入队列中,满足队列依旧是升序排列,一直持续直到队列中仅剩最后一个结点,此时这个结点就是 Human 树的根节点,构成的树也叫最优二叉树源代码下面将分为两个文件,作用分别是 Huffman 编码以及解码,不再模拟传输过程,仅仅是简单模拟数据压缩以及恢复过程.
2020-06-24 00:00:38
1033
原创 Linux_function
LINUX 函数目录int open(const char* pathname, int flags, mode_t mode);int close(int fd);ssize_t read(int fd, void* buf, size_t count);ssize_t write(int fd, const void* buf, size_t count);off_t lseek(int fd, off_t offset, int whence);int stat(const char*
2020-10-30 18:22:44
959
原创 vim
install vim-8.2 version with python2 and python3 supported on Ubuntu 18.04you can run the command to check whether your vim is supported by python2 and python3vim --versionif you can seek “+python2”, “+python3”, congratulations, you have already resolv
2020-10-24 01:00:06
162
原创 vim 操作指令
本文记录了一些常用的 vim 的快捷键以及一些配置 vimrc 的方法在普通模式下进入写入模式i :光标停在当前字符I :光标停在当前行首a :光标停在当前字符的下一个字符A :光标停在当前行尾o :在当前字符的下一行创建一空行并将光标停在行首O :在当前字符的上一行创建一空行并将光标停在行首文本操作u :撤销一次更改s :删除当前字符并进入写入模式yy :复制当前行dd :剪切当前行,可用来当作删除功能p :粘贴到光标所在行的下一行P :粘贴到光标所在行的上一行x :删除
2020-10-07 16:49:59
876
原创 排序算法之 堆排序
堆排序,平均时间复杂度为O(nlogn),是一种不稳定的排序算法。堆排序利用 堆 这种数据结构来对数组进行排序,堆是一颗完全二叉树在数组中的表示,其任意一个节点的值大于等于它的父节点,但实际上它是一个数组,只是可以当成是一个完全二叉树:假设有一个数组为 -1,1,0,它是从 0 开始编号的,而当它任意一结点的值都大于等于其父节点是,它就是一个堆了,比如 A = {-1,1,0} 或者 B = {-1,1,0}这两个序列,写成完全二叉树为(数组从左至右其实是二叉树的层序遍历):*** -1(0) *
2020-07-05 22:30:23
242
原创 排序算法之 归并排序
归并排序,采用分治思想,将已经排好序的两个数组合并成一个有序的数组,时间复杂度是O(nlogn),也是一种稳定的排序算法,其基本流程如下:采用分治的思想,假设有一个局部已经排好序的数组Y = {-4, -1, 1, 2, 5, -3, -2, 0, 3, 4},则可以分成两个组 A = {-4, -1, 1, 2, 5} 和 B = {-3, -2, 0, 3, 4},现需要将他们合并在一起,则只需要用两个下标遍历两个数组,从 A[0], B[0] 开始对比,小的 (A[0])先放入目标数组,然后遍历A
2020-07-02 22:30:57
229
原创 排序算法之 希尔排序
希尔排序 是插入排序的一种优化算法,时间复杂度为O(n^3/2),是一种不稳定的排序算法,其基本流程如下:在基本的插入排序中,每次比较完之后将操作数往前移动一个单位,有时候可能得需要移动很多次才能到达指定位置,而希尔排序是每轮移动的间隔是改变的,先将整个数组分成几组,然后按组间距移动,一轮完毕后缩小间距,直到最后间距为1,此时变成了插入排序,不过此时数组已经是大部分有序的情况了,所以用插入排序速度会有所提升(一般取初始间隔为数组长度的一半)开始数组为 :1, -1, 2, 5, -4, 0, -2,
2020-07-01 20:58:38
660
1
原创 排序算法之 选择排序
选择排序 是时间复杂度为O(n^2)的排序算法,它是不稳定的算法,基本想法是每次选择剩余数据中的最值插入,具体流程如下:初始数据为 1, -1, 2, 5, -4, 0, -2, -3, 3, 4(升序排列)第一次选择:从第 1 个位置到最后一个位置找出最小值与第 1 个位置 的数交换得-4, -1, 2, 5, 1, 0, -2, -3, 3, 4 (-4 与 1 交换)接下来从第二个位置开始依次寻找第二次选择:-4, -3, 2, 5, 1, 0, -2, -1, 3, 4
2020-06-30 22:10:23
102
原创 LeetCode 面试题 17.16. 按摩师
LeetCode 面试题 17.16. 按摩师题目描述一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。注意:本题相对原题稍作改动示例 1:输入: [1,2,3,1]输出: 4解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。示例 2:输入: [2,7,9,3,1]输出: 12解释: 选择 1
2020-06-29 23:19:46
122
原创 排序算法之 插入排序
插入排序 时间复杂度为O(n^2),是一个稳定的排序算法其基本流程如下:比较当前数跟它后一个数的大小,如果后一个数更小,则将其移动到第一个比他小的数的后面,或者是最开头(升序)初始操作数: 1, -1, 2, 5, -4, 0, -2, -3, 3, 4 (升序排列)一开始,当前操作数为 1,比较 1 和 -1 的大小发现,后一个数更小,则将 -1 移动到之前第一个比他小的数后面或者最开头,这里显然移动到开头,则:第一轮移动:1, 1, 2, 5, -4, 0, -2, -3, 3, 4
2020-06-29 22:05:42
142
原创 排序算法之 冒泡排序
冒泡排序, 顾名思义, 就是像气泡一样排序, 算法复杂度为O(n^2), 主要执行过程如下:初始操作数: 1, -1, 2, 5, -4, 0, -2, -3, 3, 4
2020-06-28 22:50:05
308
原创 LeetCode 5432.去掉最低工资和最高工资后的平均工资值(C++)
LeetCode 5432.去掉最低工资和最高工资后的平均工资值题目描述给你一个整数数组 salary ,数组里每个数都是 唯一 的,其中 salary[i] 是第 i 个员工的工资。请你返回去掉最低工资和最高工资以后,剩下员工工资的平均值。示例 1:输入:salary = [4000,3000,1000,2000]输出:2500.00000解释:最低工资和最高工资分别是 1000 和 4000 。去掉最低工资和最高工资以后的平均工资是 (2000+3000)/2= 2500示例
2020-06-28 20:46:42
214
原创 LeetCode 70.爬楼梯(C语言)
70. 爬楼梯题目描述假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1 阶 + 1 阶2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1 阶 + 1 阶 + 1 阶1 阶 + 2 阶2 阶 + 1 阶思路源代码提交...
2020-06-23 16:24:42
492
原创 LeetCode 5436.一维数组的动态和(C++)
5436. 一维数组的动态和题目描述给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。请返回 nums 的动态和。示例 1:输入:nums = [1,2,3,4]输出:[1,3,6,10]解释:动态和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4] 。示例 2:输入:nums = [1,1,1,1,1]输出:[1,2,3,4,5]解释:动态和计算过程为 [1, 1+1, 1+1+1, 1+1
2020-06-14 19:57:50
403
原创 LeetCode 66. 加一(C语言)
66. 加一题目描述给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例 1:输入: [1,2,3]输出: [1,2,4]解释: 输入数组表示数字 123。示例 2:输入: [4,3,2,1]输出: [4,3,2,2]解释: 输入数组表示数字 4321。思路大数相加的题,只需要考虑进位,又由于只是加1,尾数是9才会产生进位源代码/** *
2020-06-01 20:33:09
316
原创 LeetCode 58. 最后一个单词的长度(C++)
58. 最后一个单词的长度题目描述给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。如果不存在最后一个单词,请返回 0 。说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。示例:输入: “Hello World”输出: 5思路使用字串输入输出流可以很方便的分隔以空格、制表符隔开的字符串子串源代码及注释class Solution {public: int le
2020-05-31 20:00:31
137
原创 LeetCode 35. 搜索插入位置(C语言)
35. 搜索插入位置题目描述给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例 2:输入: [1,3,5,6], 2输出: 1示例 3:输入: [1,3,5,6], 7输出: 4示例 4:输入: [1,3,5,6], 0输出: 0思路就是一个二分查找源代码及注释int searchInsert(int* nums
2020-05-30 21:00:43
297
原创 LeetCode 26.删除排序数组中的重复项(C++)
26. 删除排序数组中的重复项题目描述给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2],函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。你不需要考虑数组中超出新长度后面的元素。示例 2:给定 nums = [0,0,1,1,1,2,2,3,3,4],函数应该
2020-05-29 22:23:20
179
原创 LeetCode 20. 有效的括号(C语言)
20. 有效的括号题目描述给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: “()”输出: true示例 2:输入: “()[]{}”输出: true示例 3:输入: “(]”输出: false示例 4:输入: “([)]”输出: false示例 5:输入: “{[]}”输出: true思
2020-05-24 20:23:38
350
原创 LeetCode 376. 摆动序列(C语言)
376. 摆动序列题目描述如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列
2020-05-23 22:28:27
531
原创 LeetCode 455. 分发饼干(C语言)
455. 分发饼干题目描述假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。注意:你可以假设胃口值为正。一个小朋友最多只能拥有一块饼干。示例 1:输入: [1,2,3], [1,1]输
2020-05-23 21:20:49
918
原创 LeetCode 15. 三数之和(C++)
15.三数之和题目描述给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。示例:给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[[-1, 0, 1],[-1, -1, 2]]思路此题是两数之和升级版,可以借鉴两数之和的双指针思想,即 a+b=-c,将数组排序之后从两头开始遍历,c先从数组
2020-05-22 19:43:28
250
原创 LeetCode 面试题02.03. 删除中间节点 (C语言)
面试题02.03. 删除中间节点Description实现一种算法,删除单向链表中间的某个节点(除了第一个和最后一个节点,不一定是中间节点),假定你只能访问该节点。示例:输入:单向链表a->b->c->d->e->f中的节点c结果:不返回任何数据,但该链表变为a->b->d->e->fAnalyze给定的函数如下:@param node 要删除的结点就是给你一个链表中的结点,然后删除这个结点,只要把下一个结点的值赋给当
2020-05-21 19:59:31
229
原创 LeetCode 136. 只出现一次的数字(C语言)
136. 只出现一次的数字Description给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 4Analyze给定的函数如下:@param nums 一个整数数组@param numsSize 数组长度@return 只出现一次的数字这题
2020-05-21 19:59:07
296
原创 LeetCode 53. 最大子序和(C语言)
53. 最大子序和Description给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。Analyze给定的函数如下:@param nums 一个数组@param numsSize 数组长度@return 最大和这题可以先求前缀和转变一下思路,当求出前缀和后问题就变成了在前缀和数组中
2020-05-21 19:58:01
261
原创 LeetCode 27. 移除元素(C语言)
27. 移除元素Description给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 *val *的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1:给定 nums = [3,2,2,3], val = 3,函数应该返回新的长度 2, 并且 nums 中的
2020-05-21 19:57:42
232
原创 LeetCode 21. 合并两个有序链表(C语言)
21. 合并两个有序链表Description将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4Analyze给定的函数如下:@param l1 链表头结点(带值)@param l2 链表头结点(带值)@return 两个链表连接的新链表头结点(带值)既然两个链表都是有序链表,那么可以从两个链
2020-05-21 19:55:36
587
原创 LeetCode 19. 删除链表的倒数第N个节点 (C语言)
19. 删除链表的倒数第N个节点Description给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 n 保证是有效的。Analyze给定的函数如下:@param head 链表头结点(带数据)@param n 一个整数,表示要删除的倒数第
2020-05-21 19:53:42
449
原创 LeetCode 14. 最长公共前缀(C语言)
14. 最长公共前缀Description编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。示例 1:输入: [“flower”,“flow”,“flight”]输出: “fl”示例 2:输入: [“dog”,“racecar”,“car”]输出: “”解释: 输入不存在公共前缀。说明:所有输入只包含小写字母 a-z 。Analyze给定的函数如下:@param strs 字符串数组@param strsSize 字符
2020-05-21 19:52:26
575
2
原创 LeetCode 13. 罗马数字转整数(C语言)
13. 罗马数字转整数Description罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符数值I1V5X10L50C100D500M1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是
2020-05-21 19:51:08
594
原创 LeetCode 11. 盛最多水的容器(C语言)
11. 盛最多水的容器Description给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。示例:输入:[1,8,6,2,5,4,8,3,7]输出:49An
2020-05-21 19:50:37
455
1
原创 LeetCode 9. 回文数(C语言)
9. 回文数Description判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为 01 。因此它不是一个回文数。Analyze给定函数如下:@param x 一个整数
2020-05-21 19:50:06
372
原创 LeetCode 8. 字符串转换整数(C语言)
8. 字符串转换整数 (atoi)Description请你来实现一个 atoi 函数,使其能将字符串转换成整数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响
2020-05-21 19:49:35
353
原创 LeetCode 7. 整数反转(C语言)
Description给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。Analyze理解题目很简单,就是将一个 int 类型范围内的整数反
2020-05-21 19:49:04
495
原创 LeetCode 2. 两数相加(C语言)
2. 两数相加Description给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储 一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807Analyze
2020-05-21 19:48:34
1385
原创 LeetCode 1. 两数之和(C语言)
1. 两数之和Description给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]Analyze可以直接暴力破解,遍历数组中每个元素与其它元素求它们的和,如果等
2020-05-21 19:48:02
278
原创 LeetCode 82. 删除排序链表中的重复元素 II (C语言)
82.删除排序链表中的重复元素 IIDescription给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现的数字。Analyze链表操作,删除一个有序链表中的所有重复元素。给定函数如下:@param head 链表的头结点(带数据)首先考虑特殊情况:给定的链表为空给定的链表只有一个元素上述两种都是特殊情况,但在此题处理方法都是一样的,即返回给定的链表然后考虑一般情况:比较发现当前结点和下一结点值相同时,应当把当前结点和下一结点一.
2020-05-21 19:47:27
488
原创 LeetCode 1103.分糖果 II(C语言)
1103.分糖果 IIDescription排排坐,分糖果。我们买了一些糖果 candies,打算把它们分给排好队的 n = num_people 个小朋友。给第一个小朋友 1 颗糖果,第二个小朋友 2 颗,依此类推,直到给最后一个小朋友 n 颗糖果。然后,我们再回到队伍的起点,给第一个小朋友 n + 1 颗糖果,第二个小朋友 n + 2 颗,依此类推,直到给最后一个小朋友 2 * n 颗糖果。重复上述过程(每次都比上一次多给出一颗糖果,当到达队伍终点后
2020-05-21 19:47:02
358
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人