算法C实现
在云边听雨
这个作者很懒,什么都没留下…
展开
-
内核阻塞函数中的ERESTARTSYS的定义
ERESTARTSYS is a part of the api between the driver and the signal-handling code in the kernel. It does not reach user-space (provided of course that it's used appropriately in the drivers :)原创 2015-01-13 15:50:33 · 1477 阅读 · 0 评论 -
把字符串前面的若干个字符移动到字符串的尾部
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。 #include void ReverseStr(char* s,int from,int to){ while (from < to)转载 2016-05-16 09:28:56 · 2226 阅读 · 0 评论 -
在字符串中找出连续最长的数字串
写一个函数,它的原形是int continumax(char *outputstr,char*intputstr)功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr所指内存。例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,outputstr所指的值为123456原创 2016-05-16 08:50:25 · 353 阅读 · 0 评论 -
合并有序数组
#includevoid merge(int A[], int m, int B[], int n){ while(m > 0 && n > 0) { if(A[m - 1] > B[n - 1]) { A[m + n - 1] = A[m - 1]; m--; } else {原创 2016-05-13 15:24:30 · 306 阅读 · 0 评论 -
最快速的方法计算出下面这个圆形是否和正方形相交
用最简单, 最快速的方法计算出下面这个圆形是否和正方形相交。" 043D坐标系 原点(0.0,0.0,0.0)05圆形:06半径r = 3.007圆心o = (*.*, 0.0, *.*)转载 2016-05-12 16:52:13 · 1153 阅读 · 0 评论 -
十进制数含有的二进制1个数
获取某十进制数中含有的二进制1的个数,求数中1的个数???1000-1 = 0111 ,正好是原数取反,这就是原理,比移位操作效率高#include int func(int x) { int count = 0; while(x) { count++; x = x&(x-1); } return转载 2015-01-11 15:48:34 · 410 阅读 · 0 评论 -
约瑟夫环---数学公式求解
约瑟夫环问题是一道经典的数据结构题目问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。#include#includeint Josephus(int n, int m)//总人数为n,从第一人开始数到m的退出,{ int i, r = 0; for (i = 2; i <= n; i++)转载 2016-05-12 14:22:09 · 1725 阅读 · 0 评论 -
输入一颗二元查找树,将该树转换为它的镜像
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。 例如输入: 8 / /6 10/ / / /5 7 9 11输出: 8 / / 10 6/ / / /11 9 7 5定义二元查找树的结点为:struct BSTreeNode // a node in th原创 2016-05-11 17:27:11 · 344 阅读 · 0 评论 -
寻找和为定值的多个数
输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来。解析:可以看出这是关于0-1背包问题,可以将问题定义为f(n,m),从1->n中选择多个数,使得之和为m 那么(1)选取n,则剩下从n-1个数中选择和为m-n的数,即求f(n-1,m-n) ( 2)不原创 2016-05-11 17:01:11 · 464 阅读 · 0 评论 -
把二元查找树转变成排序的双向链表
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 10 / / 6 14/ / / /4 8 12 16 转换成双向链表4=6=8=10=12=14=16。#include #include typedef struct BSTreeNode{ int m_nVa转载 2016-05-05 16:39:47 · 309 阅读 · 0 评论 -
给一串很长字符串要求找到符合要求的字符串,例如目的串: 123 1******3***2,12*****3这些都要找出
现一个挺高级的字符匹配算法: 给一串很长字符串,要求找到符合要求的字符串,例如目的串:123,1******3***2, 12*****3这些都要找出#include #include //强大的和谐系统 int is_contain(char *src, char *des) { //创建一个哈希表,并初始化 const int t转载 2016-05-17 15:05:28 · 1241 阅读 · 0 评论 -
一句话判断x是否为2的若干次幂
x如果是2的若干次幂,那么它的二进制就只有一个1,转换成二进制就能看出来了··· return !(x&(x-1)); 另外,求1的个数的一种简便方法:int func(int x){ int count = 0; while(x) { count++; x=x&(x-1); } r原创 2015-01-26 10:22:47 · 1164 阅读 · 0 评论 -
有两个序列a,b,大小都为 n,序列元素的值任意整数,无序 通过交换a,b中的元素,使序列 a的和与序列b的和之间的差最小
有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和之间的差最小。 例如: var a=[100,99,98, 1, 2, 3]; var b=[1, 2, 3, 4, 5, 40]; 网上看了许多解决方式,不是本身就是错的,就是代码写的真不敢恭维,以下代码比较清晰,亲测转载 2016-05-17 13:52:38 · 682 阅读 · 1 评论 -
求子数组的最大和
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18#includeint maxSubArraySum(int* a原创 2016-05-06 11:14:29 · 287 阅读 · 0 评论 -
设计包含min函数的栈
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。#include#include#includetypedef struct MinStackElement{ int data; int min;}MinStackElement_T;typedef struct MinStack原创 2016-05-06 10:50:54 · 465 阅读 · 0 评论 -
回环矩阵
#include int main(){ int n ; int a[20][20] ; printf("输入n的值:") ; scanf("%d" , &n ) ; // 初始化 int j = 0 ; int i = 0 ; int k = 0 ; int m = 0 ; int p = 0 ; int number = 0 ; // 根据分析出来的规律对原创 2016-04-28 14:39:12 · 1129 阅读 · 0 评论 -
在从 1 到 n 的正数中 1 出现的次数
输入一个整数 n,求从 1 到 n 这 n 个整数的十进制表示中 1 出现的次数。例如输入 12,从 1 到 12 这些整数中包含 1 的数字有 1, 10, 1 1 和 12, 1 一共出现了 5 次代码实现(GCC编译通过):?1234567891011转载 2016-05-17 09:17:29 · 366 阅读 · 0 评论 -
栈的 push、 pop序列
输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。如果我们希望pop的数字正好是栈顶数字,直接pop出栈即可;如果希望pop的数字目前不在栈顶,我们就到push序列中还没有被push到栈里的数字中去搜索这个数字,并把在它之前的所有数字都push进栈。如果所有的数字都被push进栈仍然没有找到这个数字,表明该序列不可能是一个pop序列。1转载 2016-05-16 16:30:31 · 805 阅读 · 0 评论 -
输入一个单向链表,输出该链表中倒数第k个结点
输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针。#include struct Node{ int nKey; struct Node* next;};struct Node *lastK(struct Node * head, int k){ if(k<0) error("k < 0.\n"); struct转载 2016-05-11 15:09:47 · 531 阅读 · 0 评论 -
求1+2+…+n, 要求不能使用乘除法、for、while、if、else、switch、case等关键字 以及条件判断语句(A?B:C)
求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)#include int sum(int n){ int tmp = 0; (n) && (tmp = sum(n-1)); return n + tmp;}int main(){ printf("%d\n", sum(10原创 2016-05-11 14:28:48 · 381 阅读 · 0 评论 -
求二叉树中节点的最大距离【编程之美解法】
// 数据结构定义struct NODE{ NODE* pLeft; // 左子树 NODE* pRight; // 右子树 int nMaxLeft; // 左子树中的最长距离 int nMaxRight; // 右子树中的最长距离 char chValue; // 该节点的值}; in转载 2016-05-11 13:45:49 · 316 阅读 · 0 评论 -
顺序表实现队列-栈
#include#include//定义栈typedef int data_t;typedef struct stack{data_t *data;int max;int top;}sstack_t;//创建sstack_t *creat_stack(int max){sstack_t *stack = malloc(sizeof(sstack_t)原创 2015-01-23 10:59:37 · 448 阅读 · 0 评论 -
最长回文子串
题目描述给定一个字符串,求它的最长回文子串的长度。分析与解法最容易想到的办法是枚举所有的子串,分别判断其是否为回文。这个思路初看起来是正确的,但却做了很多无用功,如果一个长的子串包含另一个短一些的子串,那么对子串的回文判断其实是不需要的。解法一那么如何高效的进行判断呢?我们想想,如果一段字符串是回文,那么以某个字符为中心的前缀和后缀都是相同的,例如以一段回文转载 2015-02-08 21:25:46 · 392 阅读 · 0 评论 -
C语言 二叉树相关
#include#include//定义节点typedef int data_t;typedef struct tree_node{ data_t data; struct tree_node *lchild; struct tree_node *rchild;}btree_t;//初始化btree_t *init_btree(int原创 2015-01-20 20:42:51 · 296 阅读 · 0 评论 -
回文判断
题目描述回文,英文palindrome,指一个顺着读和反过来读都一样的字符串,比如madam、我爱我,这样的短句在智力性、趣味性和艺术性上都颇有特色,中国历史上还有很多有趣的回文诗。那么,我们的第一个问题就是:判断一个字串是否是回文?分析与解法回文判断是一类典型的问题,尤其是与字符串结合后呈现出多姿多彩,在实际中使用也比较广泛,而且也是面试题中的常客,所以本节就结合转载 2015-02-07 18:35:19 · 453 阅读 · 0 评论 -
字符串包含
题目描述给定两个分别由字母组成的字符串A和字符串B,字符串B的长度比字符串A短。请问,如何最快地判断字符串B中所有字母是否都在字符串A里?为了简单起见,我们规定输入的字符串只包含大写英文字母,请实现函数bool StringContains(string &A, string &B)比如,如果是下面两个字符串:String 1:ABCDString 2:BA转载 2015-02-05 19:14:24 · 608 阅读 · 0 评论 -
旋转字符串
转自 v_JULY_v博客题目描述给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符'a'和'b'移动到字符串的尾部,使得原字符串变成字符串“cdefab”。请写一个函数完成此功能,要求对长度为n的字符串操作的时间复杂度为 O(n),空间复杂度为 O(1)。分析与解法解法一:暴力移位法初看此题,可能最转载 2015-02-05 18:35:41 · 331 阅读 · 0 评论 -
几个有意思的面试题
1,ABCDx9=DCBA因为9乘A不进位所以A只能是19乘D得个位是1所以D只能是9同样9乘B也不能进位只有1和0,1已属A所以B只能是09乘9进8要想第二位为0,乘9的个位上必须是2,C就只有8了所以ABCD=10892,一艘轮船从甲港顺水航行到乙港,立即逆水返回甲港。共用8小时。已知顺水数度比逆水数度每小时快20千米。一艘轮船从甲港顺水航行到乙港,立即逆水返回原创 2015-02-03 18:16:05 · 561 阅读 · 0 评论 -
2个双向循环链表删除相同值
有双向循环链表结点定义为:struct node{ int data;struct node *front,*next;};有两个双向循环链表 A, B,知道其头指针为: pHeadA,pHeadB,请写一函数将两链表中 data 值相同的结点删除BOOL DeteleNode(Node *pHeader, DataType Value){ if (pHe原创 2015-01-11 13:16:06 · 775 阅读 · 0 评论 -
约瑟夫环
#include#includetypedef int data_t;typedef struct link{data_t data;struct link *next;}link_t;link_t *init_link(int num){if(num return NULL; link_t *lp = NULL; link_原创 2015-01-22 20:12:32 · 273 阅读 · 0 评论 -
最近公共祖先LCA问题
问题描述求有根树的任意两个节点的最近公共祖先。分析与解法解答这个问题之前,咱们得先搞清楚到底什么是最近公共祖先。最近公共祖先简称LCA(Lowest Common Ancestor),所谓LCA,是当给定一个有根树T时,对于任意两个结点u、v,找到一个离根最远的结点x,使得x同时是u和v的祖先,x 便是u、v的最近公共祖先。(参见:http://en.wikipedia.o转载 2015-05-26 13:59:18 · 309 阅读 · 0 评论 -
单词翻转
#include #include /*翻转字符串*/void reverseStr(char *str, int nStart, int nEnd){ if(NULL == str || '\0' == *str || nStart >= nEnd) return; while(nStart < nEnd) { char cTemp =原创 2016-05-11 11:26:59 · 630 阅读 · 0 评论 -
判断整数序列是不是二元查找树的后序遍历结果
判断整数序列是不是二元查找树的后序遍历结果题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / / 6 10/ / / /5 7 9 11因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历原创 2016-05-11 09:22:58 · 448 阅读 · 0 评论 -
在二元树中找出和为某一值的所有路
输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22和如下二元树 10 / \ 5 12 / \ / \ 4 7 8 9则打印出两条路径: 10, 12和10, 5,7。二元树节点的数据结构定义为:structBinaryTreeNode // a node原创 2016-05-10 10:47:40 · 603 阅读 · 0 评论 -
数组元素出现次数
10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数。 上排的十个数如下: 【0,1,2,3,4,5,6,7,8,9】举一个例子, 数值: 0,1,2,3,4,5,6,7,8,9 分配: 6,2,1,0,0,0,1,0,0,0 0在下排出现了6次,1在下排出现了2次, 2在下排出现了1次,3在下原创 2016-05-10 10:43:07 · 373 阅读 · 0 评论 -
编程之美3.6——编程判断两个链表是否相交
问题:给出两个单向链表的头指针,而两个链表都可能带环,判断这两个链表是否相交,并且给出他们相交的第一个节点。解法:参考http://blog.csdn.net/ldong2007/article/details/4544203(1)判断链表是否存在环设置两个链表指针(fast, slow),初始值都指向链表头结点,然后连个指针都往前走,不同的是slow每转载 2016-05-10 14:19:18 · 372 阅读 · 0 评论 -
海量数据处理---Trie树(字典树)
方法介绍1.1、什么是Trie树Trie树,即字典树,又称单词查找树或键树,是一种树形结构。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是最大限度地减少无谓的字符串比较,查询效率比较高。Trie的核心思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。它有3个基本性质:转载 2015-05-26 16:15:49 · 649 阅读 · 0 评论 -
字符串编辑距离
题目描述给定一个源串和目标串,能够对源串进行如下操作:1. 在给定位置上插入一个字符2. 替换任意字符3. 删除任意字符写一个程序,返回最小操作数,使得对源串进行这些操作后等于目标串,源串和目标串的长度都小于2000。分析与解法此题常见的思路是动态规划,假如令dp[i][j] 表示源串S[0…i] 和目标串T[0…j] 的最短编辑距离,其边界:dp[0]转载 2015-05-26 14:21:13 · 540 阅读 · 0 评论 -
海量数据处理---分布式处理之MapReduce
方法介绍MapReduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。这样做的好处是可以在任务被分解后,可以通过大量机器进行并行计算,减少整个操作的时间。但如果你要我再通俗点介绍,那么,说白了,Mapreduce的原理就是一个归并排序。适用范围:数据量大,但是数据种类小可以放入内存基本原理及要点:将数据交转载 2015-05-26 15:48:36 · 2575 阅读 · 0 评论 -
基本递归与尾递归【C 算法精解】
int fact(int n){ if( n return 0; }else if(n == 0){ return 1; }else if(n == 1){ return 1; }else{ return n*fact(n - 1); }} int main(){ int原创 2014-05-14 23:30:10 · 474 阅读 · 0 评论