数据结构
编程艺术artist
这个作者很懒,什么都没留下…
展开
-
旋转数组的最小值
int Min(int* numbers,int length){if(numbers==NULL||lengththrow new std::exception("Invalid parameters");int index1=0;int index2=length-1;int indexMid=index1;while(numbers[index1]>=numbers[原创 2017-03-01 10:21:54 · 143 阅读 · 0 评论 -
判断字符串是否互为变位词
public String sort(String s){char content[]=s.toCharArray();java.util.Arrays.sort(content);return new String(content);}public boolean permutation(String s,String t){if(s.length()!=t.length原创 2017-03-26 11:18:15 · 486 阅读 · 0 评论 -
将字符串中的空格替换为“%20”
public void replaceSpaces(char[] str,int length){int spacecount=0,newlength,i;for(i=0;iif(str[i]=' ')spacecount++;}newlength=length+spacecount*2;//替换之后的长度str[newlength]='\0';for(int j=原创 2017-03-26 11:40:57 · 249 阅读 · 0 评论 -
求二叉树中和为某一值得路径,起点不一定是根节点或者叶子结点
public void findSum(TreeNode node,int sum){int depth=depth(node);int[] path=new int[depth];findSum(node,sum,path,0);}public void findSum(TreeNode node,int sum,int[] path,int level){if(node原创 2017-04-30 11:42:36 · 801 阅读 · 0 评论 -
给定两个32位的整数n和m,将m插进n的j到i的位置,n其他位置不变
int updateBits(int n,int m,int i,int j){int allones=~0;//等同于一连串的1int left=allonesint right=((1//在位置i之后的位置都为1int mask=left|right;//除i到j的位置为0,其余均为1int n_cleared=n&mask;//清楚位置j到i的位置int m_sh原创 2017-05-01 11:20:10 · 544 阅读 · 0 评论 -
有个排序后的字符串数组,其中散步着一些空字符串,找出给定字符串的位置
public int searchR(String[] strings,String str,int first,int last){if(first>last) return -1;int mid=(first+last)/2;if(strings[mid].isEmpty()){int left=mid-1;int right=mid+1;while(true){i原创 2017-05-03 14:41:56 · 327 阅读 · 0 评论 -
设计一个栈,除了pop push 还支持Min,时间复杂度都为o(1);
public class StackWithMin extends Stack{Stack s2;public StackWithMin(){s2=new Stack();}public void push(int value){if(values2.push(value);}super.push(value);}public Integer pop()原创 2017-04-23 11:37:02 · 478 阅读 · 0 评论 -
对一个栈进行排序
public static Stack sort(Stack s){Stack r=new Stack();while(!s.isEmpty()){int temp=s.pop();if(!r.isEmpty() && r.peek()>temp){s.push(r.pop());}r.push(temp);}return r;}//对一个栈进行排序原创 2017-04-24 11:47:28 · 172 阅读 · 0 评论 -
求出有序数组旋转后的最小值
思路:比如123456旋转之后为456123 那么第一个数字肯定大于或者等于最后一个数字,设置两个指针index1和index2,分别指向第一个数和最后一个数,然后求出中间的数,如果中间的数大于第一个数,说明最小的在中间的后面,将index1指向中间的数,否则将index2指向中间的数,缩小查找范围,当Index2在index1后面,就是index2-index1=1的时候,最小的数字就是Inde原创 2017-05-16 10:53:48 · 316 阅读 · 0 评论 -
求数的二进制表示中的1的个数
三种方法int numberOf1(int n){int count=0;while(n){if(n&1)count++;n=n>>1;}return count;}//第一种int NumerOf1(int n){int count=0;unsiged int flag=1;while(flag){if(n&flag){count++;原创 2017-05-16 12:04:56 · 213 阅读 · 0 评论 -
不用“+”号实现两个数的相加
可以使用位操作实现:第一步:若将两个二进制数加一起,但忘记进位,只要a和b的第i位相同,总和的第i位就是0,相当于异或操作;第二部:若将两个数加在一起,但只进位,只要a和b的i-1位皆为1,总和的第i位就为1,实质上是and加上移位操作;第三步:递归执行前两步,直到没有进位为止;public static int add(int a,int b){if(b==0)retur原创 2017-05-09 10:14:02 · 697 阅读 · 0 评论 -
找出二叉树中指定结点的下一个结点(中序后继)可以假定每个结点都有指向父节点的连接
解析:如果中序遍历右子树,那它就会是接下来第一个被访问的结点,也就是说,它是右子树最左边的结点,但是,如果没有右子树呢?若结点n没有右子树,那就表示已经遍历访问了n的子树,必须回到n的父节点,记作q。若n在q的左边,那么,下一个就是q,若n在q的右边,表示已经便利访问了q的子树,需要从q往上访问,直到找到还没访问的结点x如果位于树的最右边,就不会有下一个结点,返回nullpubli原创 2017-04-27 11:30:23 · 385 阅读 · 0 评论 -
排序算法1-冒泡排序及改进
排序算法概述所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。稳定性:一个排序算法是稳定的,就是当有两个相等记录的关键字R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前。如果算法是稳定的有什么好处转载 2017-07-31 20:57:51 · 291 阅读 · 0 评论 -
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
两种解法:(1)* 解题思路: * 先将整型数组转换成String数组,然后将String数组排序,最后将排好序的字符串数组拼接出来。关键就是制定排序规则。 * 排序规则如下: * 若ab > ba 则 a > b, * 若ab * 若ab = ba 则 a = b; * 解释说明: * 比如"3" "31"但是"331" > "313",所以要将二者拼接原创 2017-09-30 13:19:25 · 366 阅读 · 0 评论 -
红黑树插入
插入或删除操作,都有可能改变红黑树的平衡性,利用颜色变化与旋转这两大法宝就可应对所有情况,将不平衡的红黑树变为平衡的红黑树。在进行颜色变化或旋转的时候,往往要涉及祖孙三代节点:X表示操作的基准节点,P代表X的父节点,G代表X的父节点的父节点。我们先来大体预览一下插入的过程:1、沿着树查找插入点,如果查找过程中发现某个黑色节点的两个子节点都是红色,则执行一次颜色变换(父节点变原创 2017-10-01 17:34:54 · 157 阅读 · 0 评论 -
单源最短路径:迪杰斯特拉算法
一:背景展开目录Dijkstra 算法(中文名:迪杰斯特拉算法)是由荷兰计算机科学家 Edsger Wybe Dijkstra 提出。该算法常用于路由算法或者作为其他图算法的一个子模块。举例来说,如果图中的顶点表示城市,而边上的权重表示城市间开车行经的距离,该算法可以用来找到两个城市之间的最短路径。二:算法过程展开目录我们用一个例子来具体说明迪杰斯特拉算法的流程。定义源点为转载 2017-10-01 19:52:06 · 395 阅读 · 0 评论 -
kmp算法(大致伪码)
void getNext(String t,int[] next){int i=0;int j=1;char[] t=t.toCharArray();next[1]=0;whie(i if(i==0 || t[i]==t[j]){ i++; j++; next[j]=i; }else原创 2017-11-02 13:49:01 · 429 阅读 · 0 评论 -
检查二叉树平衡的递归和非递归的实现
public static boolean isBanlance(TreeNode root){if(root==null) return true;int diff=getHeight(root.left)-getHeight(root.right);if(Math.abs(diff)>1) return false;else{return isBanlance(root.l原创 2017-04-02 12:05:39 · 274 阅读 · 0 评论 -
给定两个排序的数组,其中A有足够空间容纳B,实现一个方法将B容纳进A并排序
public static void merge(int a[],int b[],int lastA,int lastB){int indexA=lastA-1;//a中最后一个元素int indexB=lastB-1;//b中最后一个元素int indexMerge=lastB+lastA-1;//合并后的数组中最后一个元素if(indexA>indexB){a[indexM原创 2017-03-16 15:44:44 · 610 阅读 · 0 评论 -
求斐波那契数列的非递归解法;
求 0,1,1,2.........的斐波那契数列算法如下:long long Fibonacci(unsigned n){int result[2]={0,1};if(nreturn result[n];long long fibNMinusOne=1;long long fibNMinusTwo=0;long long fibN=0;for(int i=2;原创 2017-03-01 11:28:26 · 214 阅读 · 0 评论 -
求一个数的二进制中1的个数
第一种解法:int NumberOf1(int n){int count=0;unsigned int flag=1;while(flag){if(n & flag) 和1与运算计算结果为1表示二进制为1count++;flag=flag}return count;}第二种解法:int qNumberOf1(int n){int count=0;原创 2017-03-01 12:42:40 · 160 阅读 · 0 评论 -
二维数组中的查找
代码实现如下:bool Find(int* martix,int rows,int columns,int number){bool found=true;if(martix!=NULL && rows>0 && columns>0){int row=0;int column=columns-1;while(row=0){if(martix[row*column+col原创 2017-02-24 11:00:55 · 167 阅读 · 0 评论 -
求二叉树的镜像二叉树
镜像二叉树与原二叉树的左右子节点相反,当交换子结点后,需要对子结点的子结点进行同样的交换操作;算法实现如下:void MirrorRecursively(BinaryTreeNode *pNode){if((pNode==null)||(pNode->m_pLeft==null&&pNode->m_pRight==null)){return ;}BinaryTree原创 2017-03-09 14:51:12 · 223 阅读 · 0 评论 -
顺时针打印矩阵
将矩阵顺时针打印出来,其中的打印一圈的功能实现:void PrintMatrixInCircle(int** numbers,int columns,int rows,int start){int endX=columns-start-1;int endY=rows-start-1;for(int i=start;iint number=numbers[start][i];原创 2017-03-09 14:55:10 · 167 阅读 · 0 评论 -
判断某数组是不是二叉搜索树的后序遍历序列
判断某数组是不是二叉搜索树的后序遍历序列:所谓二叉搜索树,是指根节点左子树结点都小于根结点,右子树结点都大于根结点;算法实现如下:bool VerifySquenceOfBST(int sequence[],int length){if(sequence[]==null || lengthreturn false;}int root=sequence[length-原创 2017-03-09 15:31:47 · 170 阅读 · 0 评论 -
合并两个排序的链表
分别用两个指针指向链表的头结点,比较这两个结点,哪个值小,就把那个值放进合并好的链表中,继续进行同样的操作;ListNode* Merge(ListNode* pHead1,ListNode* pHead2){if(pHead1==NULL){return pHead2;}else if(pHead2=NULL){return pHead1;}ListNode* pMe原创 2017-03-06 12:12:03 · 174 阅读 · 0 评论 -
二叉树的子结构判断
输入两个二叉树1和2,查看树2是否是树1的子结构;首先遍历二叉树,寻找是否有和树2头结点相同的结点;然后当树1有和树2相同的结点时,查看子结点是否相同;可用递归实现;算法实现如下:bool HasSubtree(BinaryTreeNode* pRoot1,BinaryTreeNode* pRoot2){bool result=false;if(pRoot1!=null||pR原创 2017-03-06 12:52:47 · 331 阅读 · 0 评论 -
打印字符串中所有字符的排列
void Permutation(char* pStr){if(Pstr==null){return;}Permutation(pStr,pStr);}void Permutation(char* pStr,char* pBegin){if(*pBegin=='\0'){printf("%s\n",pStr);}else{for(char* pch=pBeg原创 2017-03-11 19:21:00 · 252 阅读 · 0 评论 -
检查数组中超过一半的数字
bool g_bInputInvalid=false;bool CheckInvalidArray(int* numbers,int length){//检查是否有效输入g_bInputInvalid=false;if(numbers==null&&lengthg_bInputInvalid=true;return g_bInputInvalid;}bool Check原创 2017-03-12 11:03:09 · 137 阅读 · 0 评论 -
检查数组中超过一半的数的第二种解法
到第一个数时,让次数为1,每次遇到相同的数,次数加一,遇到不同的次数减去1;当次数为0时,让次数为1;那么数组中超过一半的肯定为最后一次次数为1时对应的那个数字,代码实现如下:int MoreThanHalfNum1(int* numbers,int length){if(CheckInvalidInput(numbers,length)){return 0;}int ti原创 2017-03-12 11:26:34 · 158 阅读 · 0 评论 -
若m*n矩阵中某个元素为零,则将元素所在的行与列清零
public void setzeros(int[][] martix){boolean[] row=new boolean [martix.length];boolean[] column=new boolean[martix[0].length];for(int i=0;ifor(int j=0;jif(martix[i][j]==0){row[i]=true;co原创 2017-03-28 19:15:57 · 706 阅读 · 0 评论 -
判断一个字符串是否是另一个字符串旋转后的结果,假设有个函数Substring判断一个字符是否为另一个字符的子字符串并且这个函数只能用一次
boolean isRotation(String s1,String s2){if(s1.length()==s2.length()&&len>0){String s1s1=s1+s1;return isSubstring(s1,s2);}return false;}//判断一个字符串是否是另一个字符串旋转后的结果原创 2017-03-28 19:29:02 · 184 阅读 · 0 评论 -
删除链表中的重复的结点两种解法
public static deleteDups(ListNode n){Hashtable table=new Hashtable();ListNode previous=null;while(n!=null){if(table.contains(n.data)){previous.next=n.next;}else{table.put(n.data, true)原创 2017-03-28 20:01:59 · 151 阅读 · 0 评论 -
输入n个整数,找出其中最小的K个数
先进行快速排序算法,使得比第k个数小的整数都排到第k个数之前,然后第k个数的左边就是数组中最小的K个数;算法实现如下:void GetLeastNumbers(int* input,int n,int* output,int k){if(input==null||output==null||nn||kreturn;}int start=0;int end=n-1;i原创 2017-03-13 12:17:06 · 1523 阅读 · 0 评论 -
求一个整数数组中的所有子数组和的最大值
bool g_InvalidInput=false;//判断输入是否有效int findGreatestSumOfSubArray(int *pData,int length){if((pData==null)||(lengthg_InvalidInput=true;return 0;}g_InvalidInput=false;int CurSum=0;int Gr原创 2017-03-13 12:22:23 · 425 阅读 · 0 评论 -
找出二叉树中某两个节点的第一个公共祖先
boolean covers(TreeNode root,TreeNode p){if(root==null) return false;if(root==p) return true;return covers(root.left,p)||covers(root.right,p);}TreeNode commonAncestorHelper(TreeNode root,Tre原创 2017-04-09 12:30:25 · 276 阅读 · 0 评论 -
红黑树的删除操作
一、红黑树定义 红黑树需要满足下面4个条件: 1、每个节点不是红色就是黑色。 2、根节点为黑色。 3、如果节点为红色,其子节点必须为黑色。 4、任意一个节点到到NULL(树尾端)的任何路径,所含之黑色节点数必须相同。二、红黑树的删除对二叉查找树,我们知道删除的结点可能有三种情况:(1)为叶子结点,转载 2018-01-25 19:00:38 · 261 阅读 · 0 评论