
c语言
desionwang
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
判断连个单链表是否交叉,并找到交叉点
链表如果相交则两个链表的形态应该是Y或者是V型,所以判断两个链表是否相交有两种方式:一、比较两个链表的尾部是否相同,如果相同则两个链表相交,交叉点可以通过两个链表的长度差进行计算,因为交点后面的长度是相同的,差值是交点前形成的,可以分别设定两个指针,长的链表先遍历到差值的位置,短的链表指向头部,分别遍历直到相等就是交点的所在。int IsCross(ListNode *p,ListNode原创 2013-07-12 18:00:12 · 3066 阅读 · 0 评论 -
如何保存指针地址 理解指针的指针
有这样一个问题就是如何使用一个整数保存一个结构体或类以及其他类型的指针,这种需求在不同语言之间调用是存在的,例如有一个结构体A:struct A{ char item1; int item2}; 需要使用一个整数b,需要用b保存这个结构体指针的地址(struct A* a = new A),使得b的值就是a的指向的地址,你可能会想直接b = a就可以了,但是编译器都不会答应。因为类型不同,一个是整数一个是指向struct A的指针。原创 2014-10-29 16:03:06 · 6533 阅读 · 0 评论 -
堆排序实现及应用
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。原创 2014-09-30 18:02:44 · 1460 阅读 · 0 评论 -
X的N次方求解——pow(x,n)实现
最近看到这样的一个题目求X的N次方,自己想了一些解决办法,记录一下留作日后参考原创 2014-09-29 16:34:51 · 16419 阅读 · 1 评论 -
排序算法总结
排序算法算是比较基本的算法,同时也是最重要的算法,涉及到的知识也比较多,下面记录一下各种排序算法的实现,包括插入排序,选择排序,快速排序,归并排序,冒泡排序等常见的排序算法:原创 2014-09-29 13:44:14 · 933 阅读 · 0 评论 -
二叉树遍历
二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的。二叉树有前、中、后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来模拟实现(递归也是用栈实现的)。下面先简要介绍三种遍历方式的递归实现,再详细介绍三种遍历方式的非递归实现。转载 2014-09-24 15:57:24 · 724 阅读 · 0 评论 -
如何建立英文字符的哈希表
经常会遇到需要建立字符串哈希表的问题,例如strtok,或者删除指定字符串的中一些字符等等,可见的字符有256个,那么很容易想到建立一个哈希表,但是其中有一些技巧,可以节省空间,其实可以使用bitmap的形式实现,但是c语言中没有现成的东西,所以需要自己实现原创 2014-09-24 14:32:10 · 1598 阅读 · 0 评论 -
C语言函数sscanf()的用法
在我的学习过程中,从文件读取数据是一件很麻烦的事,所幸有sscanf()函数。 C语言函数sscanf()的用法sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); int scanf( const c转载 2014-08-20 10:37:04 · 1045 阅读 · 0 评论 -
平方根(sqrt)算法
最近听说开平方算法挺难写,自己思考一下确实这些库函数只是一直在用,但是很少去思考如何实现的,sqrt在排序中使用频率非常的高,所以就研究了一下。大概有三种实现方式。一、用二分的方法 每次用中间数就试,如果大就到左区间选取中间数试,如果小就到右区间找中间数试,采用不断逼近的方式计算平方根,这种方式迭代次数有点多,且每次试验都要进行运算,效率不是很高,但是思路简单,巧妙的运用了二原创 2014-07-22 18:16:05 · 10774 阅读 · 0 评论 -
字符串按单词(term)反转(C代码)
有一个英文句子,每个单词(term)之间用空格分隔,例如:I like English very much 要求反转后变为 much very English like I上面的问题可以利用C语言中字符串已'\0'结尾,且'\0'是字符串打印的截止符,代码如下:#include #include void reverse(char *s){ int len = strlen(s)原创 2013-05-10 17:13:37 · 2036 阅读 · 0 评论 -
最长回文串算法
给定一个字符串找出最长回文字符串范围,例如abaabac,最长回文为abaaba1、使用暴力的算法需要O(N^3)的复杂度,需要O(N^2)的复杂度去运算字符串所用的子串,然后使用O(N)去判断是否是回文串,从而定位最长的回文子串。2、使用动态规划的思想进行求解,思路是利用子串从短到长进行逐步的动态规划求解,然后从短向长蔓延进行计算:当i == j 时 肯定是长度为1 的回文串,dp[原创 2013-09-30 10:08:15 · 5607 阅读 · 0 评论 -
数组中超过N分之一的数字
寻找数组中超过一半的元素,这是一道十分经典和普遍的面试题了,实现起来比较容易,只是需要写技巧,将问题扩展就可以衍生到求数组中错过N分一的元素。/************************************************************************* > File Name: morethanharf.c > Auth原创 2013-11-01 17:53:02 · 2866 阅读 · 0 评论 -
折半查找(二分搜索)的应用和技巧全面总结
折半查找应该算是算法中比较简单常见,但却很实用的方法之一了,又叫做二分搜索,其应用比较广泛,可以用于排序数组中元素的查找,复杂度仅为log(N),也可以用于有序数组中插入元素等等,一般而言针对排序数组的一些算法都会活多或少的用到折半查找活折半查找的思想,折半查找的实现主要分为两种方式,一种是遍历非递归形式,一种是采用递归的形式。1、非递归形式,这种实现主要是通过每次调整中点的位置来实现。原创 2013-10-28 17:39:59 · 3554 阅读 · 0 评论 -
查找单链表的中点
给定一个单链表如何高效的找到链表的中点,要求算法复杂度O(N),如果读者遇到过这样的问题,那么这个问题就迎刃而解了,验证链表是否有环的问题,使用快慢指针变量链表,同理中点问题也可以使用快慢指针实现,慢指针一次移动一个节点,快节点一次移动两个节点,快指针到达终点时,慢指针指向中点。LinkNode *FindMid(LinkNode *p){ if(p == NULL){原创 2013-08-07 09:26:17 · 5514 阅读 · 0 评论 -
硬币找零问题(动态规划求解)
如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元? (表面上这道题可以用贪心算法,但贪心算法无法保证可以求出解,比如1元换成2元的时候)首先我们思考一个问题,如何用最少的硬币凑够i元(i好了,让我们从最小的i开始吧。当i=0,即我们需要多少个硬币来凑够0元。 由于1,3,5都大于0,即没有比0小的币值,因此凑够0元我们最少需要0个硬币。 (这个分析很傻是不是原创 2013-07-26 22:10:17 · 19869 阅读 · 5 评论 -
数字二进制中1的个数
给定一个数字求该数字二进制中1的个数被广泛应用于simhash中,求两个hash值得相似程度可以先将两个hash值做异或操作,然后统计异或结果二进制中1的个数来判断两个hash值得相似性。 言归正传,求数字二进制中1的位数最直观的解法为所求数字不断的向右移位>>直到为0,统计移位过程中最低位是否是1,这样需要移位32~64位,代码如下:int bitcout1(uint32_t nu原创 2013-07-25 10:32:39 · 1178 阅读 · 0 评论 -
最长重复子串问题
最长重复子串是指在一个字符串中找出最长的出现两次或两次以上的子串,例如abcdeabbcde,则bcde则是最长的重复子串。最直观的解法是穷举所有的子串,和原串进行对比,从而选出最长的重复子串。#include #include int commonLen(const char *str1, const char *str2){ int len = 0;原创 2013-07-24 17:29:55 · 1764 阅读 · 0 评论 -
动态规划:从新手到专家(转载)
前言本文翻译自TopCoder上的一篇文章: Dynamic Programming: From novice to advanced ,并非严格逐字逐句翻译,其中加入了自己的一些理解。水平有限,还望指摘。前言_我们遇到的问题中,有很大一部分可以用动态规划(简称DP)来解。 解决这类问题可以很大地提升你的能力与技巧,我会试着帮助你理解如何使用DP来解题。 这篇文章是基于实例转载 2013-07-24 17:59:45 · 927 阅读 · 0 评论