- 博客(101)
- 收藏
- 关注
原创 信号
一个信号就是一条小消息,它通知进程系统中发生了一个某种类型的事件(是相对于进程来说的)。Linux系统中共有62个信号,1—31(普通信号),34—64(实时信号)。信号的产生1、终端组合键 Ctrl-C产生SIGINT信号(终止进程),Ctrl-\产生SIGQUIT信号(终止进程并且Core Dump),Ctrl-Z产生SIGTSTP信号(来自终端的停止信号)。 Core Dump(核心转储)
2019-11-05 17:16:16 407
原创 字符串的全排列&字符串的子集
//全排列func permute(nums []int) [][]int { ret := make([][]int,0) permute_(nums,0,&ret) return ret}func permute_(nums []int, begin int, ret *[][]int){ if begin >= len(nums){ ...
2019-03-02 21:22:44 621
原创 container/heap包的使用
package mainimport ( "fmt" "container/heap")type heap_ []intfunc (h heap_)Len() int { return len(h)}func (h heap_)Less(i,j int) bool { return h[i]<h[j]}func (h heap_)Swap(i,j int) { h[...
2019-02-14 16:29:31 356
原创 Golang算法
func twoSum(nums []int, target int) []int { container := map[int]int{} for i,v := range nums { tmp := target - v if v, ok := container[tmp]; ok { return []int{v, i} } conta...
2018-12-27 15:36:04 419
原创 排序
//插入func Insert(arr []int) { for i := 1; i < len(arr); i++ { tmp := arr[i] end := i - 1 //找插入位置&搬移 for ; end >= 0; end-- { if tmp &am
2018-12-27 15:35:55 249
原创 栈的实现
//采用切片作为底层结构,也可以使用container/list包,更为简洁package main import ( "reflect" "fmt")type Stack struct { Values []interface{} Type reflect.Type}func NewStack(valueType r
2018-12-27 15:35:47 241
原创 队列的实现
//采用切片作为底层结构package main import ( "reflect" "fmt")type Queue struct { Values []interface{} Type reflect.Type}//初始化一个队列func NewQueue(valueType reflect.Type)*Queue{ return &a
2018-12-27 15:35:39 239
原创 树的创建及遍历
//treepackage mainimport ( _"strings" "reflect" "fmt" "test/stackqueue")type Node struct { Data interface{} LChild *Node RChild *Node}func
2018-12-27 15:35:29 280
原创 字典树
package main import ( "fmt")type TrieNode struct { Child map[interface{}]*TrieNode IsEnd bool}func NewTrieNode()*TrieNode{ return &TrieNode{Child:make(map[interface{}]*TrieNode),IsEnd:fal...
2018-12-27 15:35:20 269
原创 优先级队列
package main import ( "container/heap" "fmt")type Item struct{ value string priority int idx int//item在heap中的索引}type queue []*Itemfunc (q queue) Len() int{ return len(q)}func (q queue) S...
2018-12-27 15:35:10 273
原创 list
package main import ( "fmt")type Node struct { Data int Next *Node}func NewNode(data int)*Node{ return &Node{Data:data,Next:nil}}type List struct{ Root *Node}func NewList()*List{ v...
2018-12-27 15:34:32 274
原创 各种排序算法
#include<iostream>#include<stack>#include<math.h>using namespace std;void Print(int arr[], size_t size){ for (size_t idx = 0; idx < size; ++idx) { cout << arr[idx] ...
2018-10-25 19:39:24 208
原创 海量数据问题
问题:给一个超过100G的log file, log中存着IP地址, 设计算法找到出现次数最多的K个IP地址。 1、将100G的文件进行切分,分为100个小文件。利用字符串转整数的函数(如 BKDRHash)将IP地址转换为整数key,再利用index=key%100就可将相同IP分到同一个文件。 2、依次将这100个文件读入内存,统计ip的次数。降序排列,前K个即为该文件中出现次数最多的ip.
2017-08-15 17:07:28 494
原创 布隆过滤器的实现及其优缺点
布隆过滤器是由一个很长的二进制向量和一系列随机映射函数组成。它可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误判。 布隆过滤器的原理:底层使用的是位图。当一个元素被加入集合时,通过 K 个 Hash 函数将这个元素映射成一个位阵列(Bit array)中的 K 个点,把它们置为 1。检索时,我们只要看看这些点是不是都是 1 就(大约)知道集合
2017-08-15 13:31:12 7693 1
原创 位图的实现以及位图的应用
位图就是用每一个bit位来存储某种状态,适用于大规模数据且数据状态不多的情况。通常用来判断一个数据是否存在。#include<iostream>#include<vector>using namespace std;class BitMap{public: BitMap() {} BitMap(size_t size) { _table.re
2017-08-15 12:13:19 2458
原创 i am a student.转为student. a am i
第一步:将 i am a student. 整体逆转为 .tneduts a ma i 第二步:以空格为界,部分逆转// i am a student. --> student. a am i#include<iostream>#include<stdlib.h>using namespace std; void Reverse(char *left, char *right){
2017-08-07 22:05:48 1055
原创 删除一个字符串中的重复字符
#include<iostream>#include<stdlib.h>using namespace std;void DelSameNum(char *arr){ int len = strlen(arr); bool hash[256]; //用一个数组来标记这个元素是否已经出现过了。 memset(hash, 0, sizeof(hash)); int
2017-08-07 21:53:00 3515
原创 将一个字符串循环右移K位
思路:k=2则划分区间为:abc de 第一步:abc->cba 第二步 : de->ed 第三步:整体逆转:deabc 注:左移是相同的思想//将N个字符的数组,循环右移K位。时间复杂度O(N)。#include<iostream>#include<stdlib.h>using namespace std;void Reverse(char *arr, int lef
2017-08-07 21:48:44 1708
原创 shell脚本实现希尔排序
#!/bin/bashfunction shellsort(){ #echo "the size of arr" #read size #for((i=0;i<size;++i)) #do # echo "enter the arr[$i]" # read arr[i] #done #gap=$size arr=(2
2017-08-06 21:43:46 419
原创 鸽巢排序:对一组集中且重复的数据进行排序
问题描述: int a[] = {15,14,15,18,16,17,14,17,15,15},要求对数组a进行排序,要求时间复杂度为O(N) 。#include<iostream>#include<stdlib.h>using namespace std;void Sort(int arr[], size_t size){ //先找出最大值和最小值 int max = arr
2017-08-05 23:02:05 512
原创 可变参数列表求一组数的最大值
//使用可变参数列表求一组数2, 6, 8, 4, 3的最大值#include<iostream>#include<stdlib.h>#include<stdarg.h>using namespace std;int Max(int num, ...){ int max = -0x7FFFFFFF;//32系统中最小的整数 va_list p_arg;//定义一个可变参数
2017-08-04 22:54:15 1224
原创 模拟实现atoi、itoa
先来罗列一下所有被转换的字符串可能的形式:" +5623852365223" // 溢出,无效值,ret=0" +5623" // 正常,ret=5623"-5592" // 正常 ret=5592"+321" // 正常 ret=321"/5262-22" // 无效值 ret
2017-08-04 22:46:41 482
原创 最受欢迎的前K种水果
某公司将所有员工喜欢吃的水果存储于一个数组中。要求:统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果。 1、统计所有水果出现的次数,我们可以使用map<string, int>结构string存储水果名,int存储水果数目; 2、求大家最喜欢吃的前k种水果,我们可以使用vector<map<string, int>::iterator>存放每一种水果,然后通过iterator->sec
2017-08-04 22:10:24 454
原创 C++实现单例模式
我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的动作由一个public的类方法代劳,该方法也返回单例类唯一的实例class Singleton{private: Singleton() //私有构造函数 {} static Singleton* instan
2017-07-31 15:18:24 475
原创 将二叉搜索树转换成一个排序的双向链表
先用一个具体实例来描述一下这个问题 二叉搜索树的中序遍历,当遍历到根节点时,它的左子树已经成为一个排序链表了,所以将根节点与链表中的最后一个节点连接起来。此时根节点为链表的最后一个节点,再将根节点与右子树中最小的值连接起来。 所以转换时需要知道链表的最后一个节点 具体代码实现://二叉搜索树转换为双向链表BinarySearchTreeNode<V>* TreeToList(){
2017-07-31 13:49:39 520
原创 C语言模拟实现C++中的继承和多态
先来说明一下C++中的继承和多态 继承:一个类可以使用现有类的所有功能,也就是说一个对象可以直接使用另一个对象的属性和方法,并在无需编写现有类的情况下对这些功能进行扩展。通过继承产生的新类称为子类或派生类。 多态:允许将父对象设置成为和一个或多个它的子对象相等的技术。赋值之后,父对象根据当前赋值给它的子对象的特性以不同的方式运作。通俗的说,多态性通过利用基类类型的指针或引用来指向子类对象,根据引
2017-07-31 10:38:43 542
原创 前序遍历和中序遍历重建二叉树
根据先序序列和中序序列的特点我们可以知道: 1、先序的第一个节点是根节点 2、在中序序列中,根结点前边的结点都是左子树中的,根结点右边的结点都是右子树中的 3、通过左右子树的中序序列带入前序序列可以求出左右子树的前序序列。 4、左右子树的前序序列第一个元素分别是根节点的左右孩子 5、可以递归上述步骤来重建二叉树 具体代码实现://前序+中序重建二叉树BinaryTreeNode<T
2017-07-30 14:07:55 564
原创 求二叉树中两个节点的最低公共祖先
1、该树是一棵二叉搜索树 在二叉搜索树中,左子树的所有结点的值一定比根结点小,右子树中的所有结点的值一定比根结点大。根据二叉树的这个性质,我们只需要从根结点开始与两个输入结点的值进行比较,如果当前结点的值比输入的两个结点的值都大,那么最低的公共祖先一定在左子树中,然后继续遍历左子树;如果当前结点的值比输入的两个结点的值都小,那么最低的公共祖先一定在右子树中,然后继续遍历右子树。如果当前结点的值在两
2017-07-29 12:20:28 1118
原创 判断一棵树是不是完全二叉树
满二叉树:在一棵二叉树中,所有分支结点都存在左、右子树,并且所有叶子节点都在同一层上。 完全二叉树:与满二叉树的前N个结点的结构相同的二叉树。 如何判断一个一棵树是不是完全二叉树呢? 采用广度优先遍历,从根节点开始,入队列,如果队列不为空,循环。遇到第一个没有左孩子或者右孩子的节点,设置标志位,如果之后再遇到有左孩子或右孩子的节点,那么这不是一颗完全二叉树。 具体实现:bool Comp
2017-07-28 18:30:34 1046
原创 判断一个结点/一个树是否在一棵二叉树中
判断一个结点是否在二叉树中,遍历树中结点即可作出判断//结点结构template<typename T>struct BinaryTreeNode{ BinaryTreeNode(const T& data = T()) : _data(data) , _pLeftChild(NULL) , _pRightChild(NULL)
2017-07-28 13:02:24 947
原创 二叉树的前序/中序/后序/层序的非递归遍历算法
//前序遍历----非递归 void PreOrderBinaryTree_Nor() { if (NULL == _pRoot) return; cout << "PreOrderBinaryTree_Nor:" << endl; stack<BinaryTreeNode<T>*> s;//使用栈
2017-07-28 11:35:12 610
原创 一个二叉树的镜像
二叉树的镜像即每个结点的左右孩子互换。 解决方法:先序遍历树的每个结点,若遍历到的结点有子结点,则交换它的两个子结点。 具体代码://递归算法void _BinaryMirror(BinaryTreeNode<T> *pRoot){ if (pRoot == NULL || pRoot->_pLeftChild == NULL && pRoot->_pRightChild == NU
2017-07-28 11:04:02 413
原创 求两个单链表list1与list2的差集,并将结果保存至list1中
解决方法: 遍历list1,若list1中的数据在list2中也出现了,那么删除list1中的该数据,否则保留。 代码实现:typedef struct Node{ int data; struct Node* next;}Node,*PNode;void Difference(PNode* pHead1, PNode pHead2){ PNode pList1
2017-07-27 22:16:57 1110
原创 判断一颗二叉树是否为平衡二叉树
平衡二叉树:左子树和右子树的高度相差<=1,且左右子树都是平衡二叉树。 方法一:调用求二叉树高度的函数求每个节点的左右孩子深度,然后直接判断。 方法二:在方法一中,求该结点的的左右子树深度时遍历一遍树,再次判断子树的平衡性时又遍历一遍树结构,造成遍历多次。因此现在的做法是:一边遍历树一边判断每个结点是否具有平衡性。 具体代码看下面://二叉树的高度int _Height(AVLTreeNod
2017-07-27 14:03:22 559
原创 一个数组中有一个数字的次数超过了数组的一半,求出这个字符
解法一:一个数字出现的次数超过数组大小的一半,那么如果这是一个有序的数组,这个数字必定在数组中间的位置。 解法二:一个数字出现的次数超过数组大小的一半,也就是说,该数字出现的次数比其他数字出现次数的和还要多。那么,我们可以在遍历数组时设置两个变量result,times;result记录数组中的数字,times记录次数。当我们遍历下一个数字时,如果该数字与之前保存至result中的数字相同,则ti
2017-07-23 12:23:29 451
原创 二叉树叶子节点的数目&二叉树第k层节点的数目&二叉树第k层叶子节点的数目
//二叉树叶子节点的数目size_t _GetLeafCount(BinaryTreeNode<T>* pRoot){ if (pRoot == NULL) return 0; if (NULL == pRoot->_pLeftChild && NULL == pRoot->_pRightChild) return 1; return _G
2017-07-22 15:02:43 551
原创 给定一个整数N,求N的阶乘N!末尾有多少个0?
N!=1×2×3×4×5×6×··· ×N=2^x ×3^y ×5^z · · · N!末尾有0必定是产生了10,而2和5相乘必然会产生一个10。那么问题就转化为(2^x) ×(5^z)可以产生多少个0,即min(x,z),显然x肯定大于z(能被2整除的数肯定比5多),最终问题转化为求z的个数,即找出1· · ·N能分解出多少个5。#include<iostream>using namespac
2017-07-22 13:15:37 1931
原创 一个整数二进制位中1的个数
//方法一:#include<iostream>using namespace std;int CountOf1(int val) { int count = 0; unsigned int n = 1; while (n) //二进制中有多少位则遍历多少次 { if ( n & val) /
2017-07-22 12:17:32 402
原创 元素出栈、入栈顺序的合法性
//元素出栈、入栈顺序的合法性。#include<iostream>#include<vector>#include<stack>using namespace std;bool IsPopOrder(vector<int> push,vector<int> pop){ if (push.size() != pop.size() || pop.size() == 0)
2017-07-22 11:25:52 409
原创 查找一个字符串中第一个只出现两次的字符
//方法一:时间复杂度O(N*N)#include<iostream>#include<string>using namespace std;char FindChar(char* str){ int i, j; int len = strlen(str); for (i = 0; i < len; i++) { int count = 0;
2017-07-22 10:29:19 1280 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人