算法
文章平均质量分 74
BruceZhang
计算机专业的一个小学生
展开
-
面试题目集锦--链表
前段时间一直在忙着找工作,在面试中也遇到了大量的算法题目,其中,问的比较多的是二叉树和链表之类的题目,在这里,我就把前段时间写的链表面试题贴出来,当然,由于题目很多,我只是在这里贴出它的类构造,不贴出实现的代码,需要的朋友可以去这里下载(免积分):http://download.csdn.net/detail/dlutbrucezhang/8062413 如果因为其他别的原因下载不下来的原创 2014-10-21 09:52:53 · 2366 阅读 · 0 评论 -
C语言实现单链表的逆置
单链表的逆置是一个非常经典的问题,这里利用两个思想进行解决。 首先,我们需要看下原理图,其实两个思想都是一样的,都是使后一个的节点的 next 指针指向前一个节点,依次递推,直到第二个节点指向第一个节点,第一个节点的 next 指针指向 NULL。 第一种方法: 在链表往前走的过程中,记录前一个节点,当前节点和后一个节点,并使当前节点的 next 指针指向前一个节点,原创 2013-09-15 16:29:43 · 12130 阅读 · 5 评论 -
查找重复的数
在前几天写了一个查找缺失的数的算法(http://blog.csdn.net/dlutbrucezhang/article/details/11467693),今天写一个类似的算法,查找一个重复的数。 描述:一个数组中存放连续的数字,但是其中多出一个数字,是一个重复出现的数字,当然,它可以出现在任何位置。 解决方法: 1.总和相减法 由于多出一个数,所原创 2013-09-13 19:22:15 · 1650 阅读 · 0 评论 -
数组中存储不定个数的元素
现在有这样一个问题: 首先定义一个大小为20的整型数组,就好像这样-- int a[20], 之后,根据需要存储一定量的数到数组中(可以小于20个),要求是输入数字以空格为单位隔开,直到输入回车结束输入,并把数字存入数组中。 示例:输入数据 1 2 9 8 7(\r),之后 a[0] = 1,a[1] = 2,a[2] = 9,a[3] = 8, a[4] = 7,其余初始化为0原创 2013-09-09 18:30:07 · 3484 阅读 · 5 评论 -
查找缺失的数
有这样一个数组,它包含 1 - n 中的 n - 1 个数,缺少的那个数不知道,怎样才能找到那个数? 这里有两种方法实现上述问题。 1.对所有数求和之后用原有的总和去减即可 2.利用异或运算 -- 由于异或的原理是相同则为0,所以,首先异或1到n中的每个数,接着利用所得到的结果异或数组中的 n - 1 个数,最终得到的那个数就一定是缺少的那个数 让我们看下实原创 2013-09-09 09:53:23 · 2331 阅读 · 0 评论 -
利用尾递归减少栈空间的消耗
首先,需要给出一个定义,什么是尾递归。在《算法精解》中给出的定义如下: 如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归的。尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数编译器会利用这个特点自动生成优化的代码。 看完上面这段原创 2013-08-30 16:04:12 · 2886 阅读 · 3 评论 -
c语言求最大公约数
求差判定法. 如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数是6,所以78和60的最大公约数是6. 如果两个数相差较大,可以用大数减去小数的若干倍,一直减到差比小数小为止,差和小数的最大公约数就是原来两数的最大公约数.例如:求92和16的最大公约数.92-16=76,76-1转载 2013-08-14 17:42:10 · 18691 阅读 · 0 评论 -
java模拟链表
java语言不存在指针,但是我们仍可以用相应的逻辑模拟链表的实现,下面这段代码就是我的一个小伙伴实现的:package com.brucezhang.test;public class ThreadTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-genera转载 2013-08-12 16:33:22 · 1693 阅读 · 0 评论 -
单链表快速排序算法实现
单链表结构:typedef int ElemType;typedef struct ListNode* List;struct ListNode{ ElemType key List next;};实现代码如下:void QuickSort( List head, List tail ){ if ( head->next == tail || head->next->ne转载 2013-08-08 13:35:35 · 1577 阅读 · 1 评论 -
C语言单链表实现19个功能完全详解
#include "stdafx.h"#include "stdio.h"#include #include "string.h" typedef int elemType ; /************************************************************************//* 以下是关于线性表链接存储(单转载 2013-08-08 13:09:05 · 1293 阅读 · 0 评论 -
两个数之和等于第三个数
这是一个很好的算法题,解法类似于快速排序的整理方法。同时,更为值得注意的是这道题是 人人网2014校园招聘的笔试题,下面首先对题目进行描述: 给出一个有序数组,另外给出第三个数,问是否能在数组中找到两个数,这两个数之和等于第三个数。 我们首先看到第一句话,这个数组是有序的,所以,我们可以定义两个指针,一个指向数组的第一个元素,另一个指向应该指向的位置(这个需要看具体的实现和数组原创 2013-09-16 16:04:34 · 6463 阅读 · 2 评论 -
判断单链表是否有环
单链表是最常见的数据结构,带环的单链表不是很常见,但是在许多面试中出现的概率较高,其中不乏一些经典的问题,怎样判断单链表中是否有环。 单链表带环指的是如下这张图所示情况: 其实思想还是挺简单的: 我们需要两个指针,初始时都指向链表的头,之后指针同时移动,其中一个指针一次移动一步,另一个指针一步移动两步,如果两个指针有相等的可能,则链表就是有环的,否则,出现一个指针指向原创 2013-09-16 17:09:36 · 2050 阅读 · 2 评论 -
面试题目集锦 -- 排序算法
面试过程中,免不了会问一些比较基础的问题,而这些基础的问题肯定要说到排序上去。 我们知道,排序算法包含插入,选择,冒泡,快速,归并,堆排序等等,大多时候,我们在面试的时候,最常问的排序算法是堆,快速和归并排序,其他的几种相对简单,问的较少,那么,我们只需要在面试前把它们都弄懂然后自己在纸上写出来就可以了。在写这些算法的时候,我查了很多的资料,也看了很多文章,毕竟排序算法非常经典,所以,在原创 2014-10-23 10:32:22 · 2834 阅读 · 4 评论 -
面试题目集锦--二叉树
面试过程中,问的最多的题目大致是可以分为两类的,一类是链表,另一类就是二叉树了,树(普通数)和B(+-)树由于稍难些,问的不是很多。 往往在问到二叉树的时候,一般都是用递归的解法,然后现场写代码。 这里,还是像上一篇文章一样,我对许多二叉树的算法进行了总结,需要下载的朋友可以去这里免积分下载:http://download.csdn.net/detail/dlutbrucezh原创 2014-10-22 09:20:06 · 2584 阅读 · 0 评论 -
STL内存分配器:allocator
一、STL泛型容器 与 内存管理1.1 STL泛型容器中隐藏了内存管理工作 STL提供了很多泛型容器,如vector,list,map等。程序员使用时之关心如何存放对象,不用关心如何管理内存。 容器会根据需要自动增长内存,在退出其作用域时,也会自动销毁占有的内存。 STL容器巧妙的避开了繁琐而且容易出错的内存管理工作。二、STL默认的内存分配器2.1 STL默认的内存转载 2014-03-14 14:50:44 · 2300 阅读 · 0 评论 -
查找第二大的数
有一个数组,请给出一个算法,找出第二大的数。 记录一个最大值和一个次大值,依次比较可获得结果。 算法的实现:#include int true = 0;int find_sec_max(int *array, int len);int main(int argc, char **argv){ int test_array[] = {2, 5, 12, 7, 3原创 2013-10-13 19:38:53 · 2147 阅读 · 0 评论 -
合并两个有序的链表
记得以前写过一个合并两个有序数组的问题,也就是相互比较并放入合适的位置,今天的这个算法和数组的问题其实是一样的,这里不多做介绍了,直接贴出代码:链表的定义:typedef struct _Node{ int data; struct _Node *next;}Node, *List;合并代码:List merge_two_list(List list1, List list2){ Li原创 2013-09-27 19:37:13 · 1668 阅读 · 0 评论 -
C语言 string.h 中函数的实现
最近是校招很热的季节,实验室里讨论最多的也就是算法,面试和笔试的必备知识储备。昨天想起 C 语言中 string.h 中的函数在操作字符串时很方便,所以,就想起写写那些函数。 当然,这些函数实现的只是简单的功能,并没有加入太多的排错功能,欢迎大家及时指正代码中出现的问题,谢谢!my_string.h#include #include int my_strcmp(char *stri原创 2013-09-25 08:47:02 · 4095 阅读 · 12 评论 -
快速修改数组的问题
记得去年上算法分析课的时候讲过怎么快速的修改数组,比如,把数组中偶数放在前面,奇数放在后面;把数组中能被三除尽的数放在前面,不能的则放在后面。。。 如果,我没看到那道题我的思路肯定是一个一个的写函数呗,不就是快速排序的思想吗,不过,当我看到了那道题的解法后,发现,真的应该好好想想函数的通用性。 下面,我直接贴出代码:#include int quick_insert_(in原创 2013-09-25 15:15:15 · 1795 阅读 · 0 评论 -
合并有序数组问题
有这样一个问题,现在有两个有序的数组,第一个数组的空间足够容纳两个有序数组中的数,利用高效的方法把两个数组合并,并使得数组是有序的,且最后得到的是第一个数组,同时不借助其他额外的存储空间。 其实这种题的解法几乎都是一样的,都是从最后一个数开始,这就是取极值的思想,因为数组是有序的,所以,每个数组中最大的那个数一定在数组的末尾。 这里,先贴出代码,之后再讲解原理:#include原创 2013-09-19 16:30:08 · 4175 阅读 · 7 评论 -
倒序输出单链表的内容
单链表是最简单的数据结构,同时也是最常接触的数据结构,这个问题也很常见,通常这个问题我们有两种解决办法。 1.逆置单链表之后输出 这篇文章讲述了这样的过程http://blog.csdn.net/dlutbrucezhang/article/details/11709633,但是这种方法不一定可行,因为这样改变了单链表原来的结构 2.利用栈的后进先出的思想,首先我们正原创 2013-09-19 16:12:23 · 3105 阅读 · 0 评论 -
C语言一个双向链表的实现
首先编写头文件,头文件里做相关的定义和声明,DList.h内容如下:#ifndef DList_H #define DList_H typedef int Item; typedef struct Node * PNode; typedef PNode Position; /*定义节点类型*/ typedef struct Node { Item data;转载 2013-08-07 21:19:13 · 1341 阅读 · 0 评论 -
红黑树
红黑树是一种平衡二叉搜索树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由Rudolf Bayer发明的,他称之为"对称二叉B树",它现代的名字是在 Leo J. Guibas 和 Robert Sedgewick 于1978年写的一篇论文中获得的。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入转载 2013-08-07 16:03:57 · 1333 阅读 · 2 评论 -
二叉查找树(二叉排序树)的详细实现
1、序 详细实现了二叉查找树的各种操作:插入结点、构造二叉树、删除结点、查找、 查找最大值、查找最小值、查找指定结点的前驱和后继2、二叉查找树简介 它或者是一棵空树;或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树3、二叉查找树的各种转载 2013-08-07 14:32:01 · 1270 阅读 · 0 评论 -
归并排序--数组和链表的实现
数组实现/***归并排序三步走:1 分割子问题;2 递归;3 合并子问题。*/#include "stdafx.h"#include using namespace std;void mergeArray(int *a, int begin1, int length1, int begin2, int length2){ int length = length1 +原创 2013-03-12 17:01:47 · 2134 阅读 · 0 评论 -
堆栈的各种算法
注:此文章来自“CSDN”博主,仅在此借鉴,学习各种基本算法实现小结(二)—— 堆 栈(均已测试通过)==============================================================栈——数组实现测试环境:Win - TC[cpp] view plaincopyprint?原创 2013-02-10 22:21:38 · 4853 阅读 · 0 评论 -
各种常用算法
注:这篇文章来自“CSDN”博主,仅借鉴,学习1、判断素数测试环境:VC 6.0 (C)[cpp] view plaincopyprint?#include #include int is_sushu(int n) { int i, mid; mid=(int)sqrt(n);原创 2013-02-10 22:19:15 · 1967 阅读 · 0 评论 -
汉诺塔问题
算法介绍其实算法非常简单,当盘子的个数为n时,移动的次数应等于2^n – 1(有兴趣的可以自己证明试试看)。后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 A B C;若n为奇数,按顺时针方向依次摆放 A C B。原创 2013-02-10 21:52:21 · 3730 阅读 · 0 评论 -
对单链表的相关操作
单链表的学习是数据结构中最基本的知识,这个例子是我现实的一个单链表,并对这个单链表执行一系列的操作。下图是实现的截图:下面给出实现的C++代码:#include #include using namespace std;typedef struct Lnode{int data;struct Lnode *next; }LNode;int Get原创 2013-02-06 18:11:23 · 919 阅读 · 0 评论 -
数据结构--二叉树的创建和相关操作
下面给出两个关于二叉树的题目:1.编写程序任意输入二叉树的结点个数和结点值,构造一棵二叉树,采用三种递归遍历算法(前序、中序、后序)对这棵二叉树进行遍历并计算出二叉树的高度。2 .编写程序生成下面所示的二叉树,并采用先序遍历的非递归算法对此二叉树进行遍历。 下面实现这两个题目:1.#include "stdafx.h"#include"iostream.h"原创 2013-02-06 18:17:25 · 1979 阅读 · 0 评论 -
算法设计--查找无序数组中第K大的数字
给出一个数组,要求查找出这个数组中按顺序排第K大的数字。思路:利用快速排序的思想,把数组中的元素分治,并计算中间值的位置,如果是K,则这个数就是第K大的数字,如果比K小,那么再次利用快速排序分治中值以后的数据,如果比K大,则排序前面的数字,直到找到K的位置。下面给出C++实现的代码:#include #include using namespace std;int par原创 2013-01-30 19:18:24 · 1971 阅读 · 0 评论 -
排序算法--睡眠排序
我们学数据结构的时候会学到多种排序算法,基本上都是基于比较的排序,下面的这个排序算法并不是基于比较,确切的说它是基于cpu调度算法实现的,这个算法的作者称之为--睡眠排序。 它的基本思想是,对一组数据进行排序,不能存在负数值,这个数是多大,那么就在线程里睡眠它的10倍再加10,不是睡眠和它的数值一样大的原因是,当数值太小时,误差太大,睡眠的时间不比输出的时间少,那么就会存在不正确的输出翻译 2013-01-27 11:11:31 · 4284 阅读 · 2 评论 -
排序算法--排序算法汇总
排序算法无疑是学习数据结构中的重点内容,本文将给出排序算法的汇总。下面是具体的实现:#include#include#include#define N 1000000int Array[N];int Temp[N];//1、冒泡排序void BubbleSort(int a[],int n){ int i,j; int temp; int tag原创 2013-01-28 00:47:55 · 3070 阅读 · 0 评论 -
判断仅有指针域的单链表是否有环且怎么找到环
链表结构如下:struct ListNode { struct ListNode *next;};思路是:1.设两个指针p和q,p每次移动两个节点(如果没有走到结尾),q每次移动一个节点,如果没有环p会走到最后即p=null,如果有环的话,由于p走的块,q走的慢,p在之后的某个时候会赶上q即p=q时间复杂度有环时为O(n+k)(k为环包含节点数的一半),没原创 2013-03-30 19:03:23 · 1761 阅读 · 0 评论 -
HashTable
#include #include #include #include /*=================hash table start=========================================*/#define HASH_TABLE_MAX_SIZE 10000typedef struct HashNode_Struct HashNode;struct原创 2013-03-30 21:38:19 · 1470 阅读 · 0 评论 -
互换两个变量,不使用中间变量
第一种方法:a=a+b;b=a-b;a=a-b; 代码如下:#include "stdio.h"int main(void){ int a,b; printf("请输入两个变量a和b:/n"); scanf("%d %d",&a,&b); printf("a和b交换前:/n"); printf("a=%d b=%d/n",a,b); a=a+b; b=a-b; a=a-b;转载 2013-07-14 20:47:12 · 1218 阅读 · 0 评论 -
求绝对值最小的数
有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4。算法实现的基本思路找到负数和正数的分界点,如果正好是0就是它了,如果是正数,再和左面相邻的负数绝对值比较,如果是负数,取取绝对值与右面正数比较。还要考虑数组只转载 2013-06-22 12:49:23 · 1960 阅读 · 0 评论 -
C语言中的位运算和逻辑运算
这篇文章来自:http://blog.csdn.net/qp120291570/article/details/8708286位运算C语言中的位运算包括与(&),或(|),亦或(^),非(~).下面的代码包扩了这些基本运算,还有一个两个数的交换(不用第三个数)。#include#include//print a int in binaryvoid bit_print(int a){ i转载 2013-06-16 21:17:10 · 1615 阅读 · 1 评论 -
c语言实现双链表
#include #include #include typedef struct myList DNode; struct myList { DNode *next; DNode *prev; int data; }; DNode* init(int data); void insertLastNode(DN原创 2013-04-19 15:45:05 · 1606 阅读 · 0 评论 -
各种排序算法的JAVA实现
原文转自:http://blog.csdn.net/zhangerqing/article/details/8831542本文就是介绍一些常见的排序算法。排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序、选择排序、冒泡排序、快速排序(重点)、堆排序、归并排序等等。看下图:原创 2013-04-25 19:27:34 · 1559 阅读 · 0 评论