![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 55
SKY技术修炼指南
欢迎我的关注公众号:SKY技术修炼指南
展开
-
图解堆排序
本文介绍一下常见的堆排序的原理及实现代码。简介堆排序是一种树形选择排序方法,要了解堆排序就不得不了解一下堆。简单的说,堆是一种完全二叉树,根据父子节点之间的大小关系的不同还可以细分为大顶堆和小顶堆。大顶堆是指任一节点的值都大于或等于其左右孩子的值,小顶堆是指任一节点的值都小于或等于其左右孩子的值。下图分别是大顶堆和小顶堆的结构。堆排序过程我们以大顶堆为例,演示一下堆排序过程。现在我们有一个待排序数组[2,7,4,3,1,9,5],初始状态是这样的:进行堆排序时,一般需要对节点从下到上,从右原创 2021-02-04 23:39:26 · 129 阅读 · 0 评论 -
分治算法与归并排序
距离上次写快排算法的文章已经过去一个半月了,和本文要提到的归并排序算法类似,快排也是分治思想的一种典型应用,如果有不熟悉快速排序的同学可以翻阅我之前写过的的快速排序算法的文章。分治算法首先为大家介绍一下什么是分治,分治是将一个大问题分割成若干个和原来问题形式相同但规模更小的子问题,然后处理这些小问题,最终实现整个大问题的过程。额…上面说的概念确实很难理解,我们换一个生活中的场景来介绍一下什么是分治吧。小明手里有8枚硬币,其中有1枚是假币,已知假币比真币轻,现在我们有一架天平,那么我们该怎么找出假原创 2020-06-13 19:35:45 · 422 阅读 · 0 评论 -
快速排序Java代码简洁实现
学习过数据结构的同学们都知道,快速排序算法是一种时间复杂度为O(nlogn)的排序算法,在各种排序算法中算是较为高效的方法,企业面试中也经常有手撕快排的环节。本文将阐述算法的基本思想,并用Java代码的形式实现快速排序代码。算法思想快速排序主要采用分治的基本思想,每次将一个位置上的数据归位,此时该数左边的所有数据都比该数小,右边所有的数据都比该数大,然后递归将已归位的数据左右两边再次进行快...原创 2020-04-29 16:29:11 · 3989 阅读 · 3 评论 -
翻转子串
题目描述假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串。请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数。给定两个字符串s1,s2,请返回bool值代表s2是否由s1旋转而成。字符串中字符为英文字母和空格,区分大小写,字符串长度小于等于1000。测试样例"Hello world","wo...原创 2019-03-09 23:20:27 · 123 阅读 · 0 评论 -
表达式运算
题目描述第一行输入行数n,再在接下来n行每行输入一个表达式,得出结果输入样例31+12.2/31+2*3输出样例20.77方法一#include <bits/stdc++.h>using namespace std;double F(string s) { queue<double> q_num...原创 2019-03-07 21:06:36 · 428 阅读 · 0 评论 -
二叉树的遍历代码(非递归)
//非递归先序遍历void PreOrderTraverse(BiTree b) { InitStack(S); BiTree p = b; while (p || !IsEmpty(S)) { while (p) { printf("%c", p->data); //先序先遍历结点 Push(S, ...原创 2019-03-12 15:12:08 · 477 阅读 · 0 评论 -
Leetcode-合并两个有序数组
给定两个有序整数数组nums1和nums2,将nums2合并到nums1中,使得num1成为一个有序数组。说明:初始化nums1和nums2的元素数量分别为m和n。 你可以假设nums1有足够的空间(空间大小大于或等于m + n)来保存nums2中的元素。示例:输入:nums1 = [1,2,3,0,0,0], m = 3nums2 ...原创 2019-05-19 20:00:34 · 100 阅读 · 0 评论 -
Leetcode-2的幂
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。示例1:输入: 1输出: true解释: 20= 1示例 2:输入: 16输出: true解释: 24= 16示例 3:输入: 218输出: false方法一#include <stdio.h>#include <stdbool.h>bool isPowe...原创 2019-05-19 20:17:50 · 207 阅读 · 0 评论 -
Leetcode-有效的字母异位词
给定两个字符串s和t,编写一个函数来判断t是否是s的一个字母异位词。示例1:输入: s = "anagram", t = "nagaram"输出: true示例 2:输入: s = "rat", t = "car"输出: false说明:你可以假设字符串只包含小写字母。#include <stdio.h>#include <...原创 2019-05-15 19:05:39 · 63 阅读 · 0 评论 -
Leetcode-求众数
给定一个大小为n的数组,找到其中的众数。众数是指在数组中出现次数大于⌊ n/2 ⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在众数。示例1:输入: [3,2,3]输出: 3示例2:输入: [2,2,1,1,1,2,2]输出: 2方法一#include <stdio.h>#include <stdbool.h>...原创 2019-05-15 20:00:15 · 142 阅读 · 0 评论 -
Leetcode-缺少数字
给定一个包含0, 1, 2, ..., n中n个数的序列,找出 0 ..n中没有出现在序列中的那个数。示例 1:输入: [3,0,1]输出: 2示例2:输入: [9,6,4,2,3,5,7,0,1]输出: 8方法一#include <stdio.h>#include <stdbool.h>#include <st...原创 2019-05-16 13:09:44 · 89 阅读 · 0 评论 -
Leetcode-只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例2:输入: [4,1,2,1,2]输出: 4#include <stdio.h>#include <stdbool.h&...原创 2019-05-16 13:38:27 · 75 阅读 · 0 评论 -
将0移到最后
给定一个数组,把数组里面的0全部移动到数组的最后面。示例:输入:arr[]={1, 7, 0, 2, 3, 0, 4, 8} n=8输出:arr[]={1, 7, 2, 3, 4, 8, 0, 0}#include <stdio.h>#include <stdbool.h>void moveZeros(int arr[], int n) ...原创 2019-05-21 21:21:36 · 368 阅读 · 0 评论 -
广度优先搜索(BFS)代码实现
Python代码实现如下:graph = { "A": ["B", "C"], "B": ["A", "C", "D"], "C": ["A", "B", "D", "E"], "D": ["B", "C", "E", "F"], "E": ["C", "D"], "F": ["D"]}def BFS(graph, s): ...原创 2019-07-16 12:51:07 · 741 阅读 · 0 评论 -
深度优先搜索(DFS)代码实现
Python代码实现如下:graph = { "A": ["B", "C"], "B": ["A", "C", "D"], "C": ["A", "B", "D", "E"], "D": ["B", "C", "E", "F"], "E": ["C", "D"], "F": ["D"]}def DFS(graph, s): ...原创 2019-07-16 13:04:00 · 919 阅读 · 0 评论 -
二叉树的所有路径
给定一个二叉树,返回所有从根节点到叶子节点的路径。说明:叶子节点是指没有子节点的节点。示例:输入: 1/ \2 3\ 5输出: ["1->2->5", "1->3"]解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3最直观的方法是使用递归。在递归遍历二叉树时,需要考虑当前的节点和它...原创 2019-08-10 11:09:50 · 126 阅读 · 0 评论 -
后序遍历
题目描述已知某二叉树的先序序列和中序序列,编程计算并输出该二叉树的后序序列。输入描述有多组数据,每组分为两行输入,第一行表示指定二叉树的先序序列,第二行表示该二叉树的中序序列,序列元素均为大写英文字符,表示二叉树的结点。输出描述对于每组数组,在一行上输出该二叉树的后序序列。输入ABDGCEFHDGBAECHF输出GDBEHFCA...原创 2019-03-08 22:51:46 · 255 阅读 · 0 评论 -
围圈报数
题目描述N 个人围成一圈顺序编号,从1 号开始按1、2、3 顺序报数,报3 者退出圈外,其余的人再从1、2、3 开始报数,报3 的人再退出圈外,依次类推。请按退出顺序输出每个退出人的原序号。要求使用环行链表编程。输入描述输入第一行为整数m表示有m组测试数据,接下来m行每行一个整数N,N不超过50。输出描述输出m行,每行表示题目所求,用空格隔开。输入1...原创 2019-03-08 21:11:55 · 851 阅读 · 0 评论 -
求两个多项式的和
题目描述输入两个多项式,计算它们的和。 每个多项式有若干对整数表示,每组整数中,第一个整数表示系数(非0),第二个整数表示该项的次数。 如由3 3 5 -2 1 4 0表示3x^5 - 2 * x + 4其中第一个3表示该多项式由三个整数对表示。输入描述输入为两行,分别表示两个多项式。表示每项的整数对按照次数大小降序给出。(次数绝对值小于1000,系数绝对值小于10000)...原创 2019-03-02 22:32:56 · 1038 阅读 · 0 评论 -
日期差值计算
给定两个日期,求出两个日期的差值,如果两个日期是连续的,则规定它们之间的天数为两天。样例输入2013010120130105样例输出5#include <iostream>#include <string.h>using namespace std;bool isLeapYear(int year) { if (year%400==0 || (y...原创 2019-01-28 11:15:39 · 288 阅读 · 0 评论 -
简单选择排序和直接插入排序
#include <iostream>using namespace std;//直接插入排序// int A[10] = {0, 3, 1, 5, -1, 2, 7, 3, 4, 10};void insertSort(int A[], int n) { for (int i = 1; i < n; i++) { int temp = ...原创 2019-01-29 21:18:57 · 501 阅读 · 0 评论 -
数字排序(数字个数不确定)
排序。输入n,有n组测试数输入样例21 4 7 2 58 9 4 3输出样例1 2 4 5 73 4 8 9代码如下:#include <iostream>#include <vector>#include <string>using namespace std;vector<int> ...原创 2019-02-21 21:09:12 · 584 阅读 · 1 评论 -
C++中排序函数sort的用法
C++中使用sort函数必须加上头文件"#include <algorithm>"。sort函数的使用方式是:sort(首元素地址, 尾元素地址的下一位,比较函数(选填)) 代码示例如下:#include <iostream>#include <stdio.h>#include <algorithm>#include &l...原创 2019-01-30 21:33:03 · 774 阅读 · 0 评论 -
单词识别(统计单词个数)
题目描述输入一个英文句子,把句子中的单词(不区分大小写)按出现次数按从多到少把单词和次数在屏幕上输出来,要求能识别英文句号和逗号,即是说单词由空格、句号和逗号隔开。输入描述输入有若干行,总计不超过1000个字符。输出描述输出格式参见样例。示例1输入A blockhouse is a small castle that has four openings th...原创 2019-02-23 17:02:03 · 3759 阅读 · 0 评论 -
字符串替换
请你实现一个简单的字符串替换函数。原串中需要替换的占位符为"%s",请按照参数列表的顺序一一替换占位符。若参数列表的字符数大于占位符个数。则将剩下的参数字符添加到字符串的结尾。给定一个字符串A,同时给定它的长度n及参数字符数组arg,请返回替换后的字符串。保证参数个数大于等于占位符个数。保证原串由大小写英文字母组成,同时长度小于等于500。输入样例"A%sC%sE",7,['B',...原创 2019-03-01 13:41:13 · 194 阅读 · 0 评论 -
玛雅人的密码
题目描述玛雅人有一种密码,如果字符串中出现连续的2012四个数字就能解开密码。给一个长度为N的字符串,(2=<N<=13)该字符串中只含有0,1,2三种数字,问这个字符串要移位几次才能解开密码,每次只能移动相邻的两个数字。例如02120经过一次移位,可以得到20120,01220,02210,02102,其中20120符合要求,因此输出为1.如果无论移位多少次都解不开密码,输出-1...原创 2019-03-04 21:35:16 · 909 阅读 · 0 评论 -
平均时间
输入两组时间(时h,分m, 秒s),计算平均时间,两组时间差不超过1小时,h在0-11之间。输入样例1 20 30 1 30 300 20 30 11 20 30 输出样例 1 25 3011 55 30#include <iostream>using namespace std;//比较两个时间的大小,若1大则返回true,否则返回fal...原创 2019-02-25 20:36:13 · 772 阅读 · 0 评论 -
约瑟夫问题II
题目描述约瑟夫问题是一个著名的趣题。这里我们稍稍修改一下规则。有n个人站成一列。并从头到尾给他们编号,第一个人编号为1。然后从头开始报数,第一轮依次报1,2,1,2...然后报到2的人出局。接着第二轮再从上一轮最后一个报数的人开始依次报1,2,3,1,2,3...报到2,3的人出局。以此类推直到剩下以后一个人。现在需要求的即是这个人的编号。给定一个intn,代表游戏的人数。请返回最后一个...原创 2019-03-05 15:40:45 · 383 阅读 · 0 评论 -
约瑟夫问题I
约瑟夫问题是一个非常著名的趣题,即由n个人坐成一圈,按顺时针由1开始给他们编号。然后由第一个人开始报数,数到m的人出局。现在需要求的是最后一个出局的人的编号。给定两个int n和m,代表游戏的人数。请返回最后一个出局的人的编号。保证n和m小于等于1000。输入样例5 3输出样例4#include <iostream>#include <...原创 2019-03-05 15:40:30 · 254 阅读 · 0 评论 -
C++括号匹配代码实现
#include <iostream>#include <cstring>#include <stack>using namespace std;//判断括号是否匹配bool isMatch(string s) { stack<char> st; int len = s.size(); for (int i = ...原创 2019-02-20 22:17:58 · 2601 阅读 · 1 评论 -
一年中的第几天
#include <stdio.h>#include <math.h>//判断是否是闰年bool isLeapYear(int y) { if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) { return true; } return false;}//...原创 2019-02-26 15:19:24 · 814 阅读 · 0 评论 -
最次方数
编写一个程序求一个整数任意次方的最后三位数。即:求的最后三位数,其中x和a从键盘输入。输入样例 13 13输出样例 253#include <stdio.h>#include <math.h>//求出x的a次方的最后三位数void lastThreeNum(int x, int a) { int i; int nu...原创 2019-02-26 16:41:18 · 1037 阅读 · 2 评论 -
五猴分桃
5只猴子分一堆桃子,怎么也不能分成5等份,只好先去睡觉,准备第二天再分。夜里1只猴子偷偷爬起来,先吃掉1个桃子,然后将其分成5等份,藏起自己的一份就去睡觉了;第2只猴子又爬起来,吃掉1个桃子后,也将桃子分成5等分,藏起自己的一份睡觉去了;以后的3只猴子都先后照此办理。问最初至少有多少个桃子?最后一只猴子走后还有多少个桃子?#include <stdio.h>int main(...原创 2019-02-26 18:48:19 · 990 阅读 · 0 评论 -
翻转字符串中的单词
翻转字符串中的单词给定一个字符串,逐个翻转字符串中的每个单词。样例给出s = “the sky is blue”,返回"blue is sky the"说明单词的构成:无空格字母构成一个单词输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个#include &lt;iostream&gt;#inc...原创 2019-01-28 10:57:31 · 220 阅读 · 0 评论