摘要: #include<stdlib.h>#include<stdio.h>typedef struct node { int data; struct node *next;}Node;Node *CreatList( int n ) /*n用于指定链表长度*/{ int val, i; Node *phead, *p; phead = ( Node * )malloc( sizeof( Node ) ); /*建立一个带头结点的链表*/ phead->next = NULL; printf( "输入链表节点数据:\n" ); for( i = 0 阅读全文
posted @ 2012-09-21 20:21 糙哥 阅读(477) 评论(0) 推荐(0) 编辑
摘要: 昨天看了一下用于字符子串查找的KMP算法,很巧妙,也很难编,程序不长,理解起来可真是费劲。因为要用C语言来实现,所以书里KMP算法定义的next数组的求值方法需要改动,因为C语言里的字符串数据结构并不是让第一位存储字符串长度,而是直接保存了第一个字符,就是这样一个小小的变化,可让我伤透了脑筋,而且即便如此,对于算法的本质也不算了解得很透彻,几乎是在死命调试的情况下把程序给实现出来,里面是不是有bug也不敢确定,编程可真是件纠结的事,要是早些接触就好了,可以静静的思考,不用背负着找工作的压力来学习。 寻找字符串的子串,结果返回第一个匹配的子串首字符的位置,从0开始。1.先从简单算法开始,简... 阅读全文
posted @ 2012-09-20 14:53 糙哥 阅读(480) 评论(0) 推荐(0) 编辑
摘要: 出处——《剑指offer》题目:实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2。1.假设要检测9的二进制中1的个数(1001),将其与1(0001)求‘与’来判断其最右边的一位是否为1,可以通过对9(1001)进行循环右移并与1(0001)求‘与’来得到总的1的个数,也可以通过对1(0001)循环左移并与9(1001)求‘与’来得到1的个数。但考虑到当对负数进行右移时,二进制最左边会使用1进行填充,而不是使用0,会使得循环判断条件始终为真,陷入死循环(使用while( n )时),因此采用对1(0001)进行循 阅读全文
posted @ 2012-09-18 15:02 糙哥 阅读(632) 评论(0) 推荐(0) 编辑
摘要: 出处——《剑指Offer》使用递归实现实现斐波那契int Fibonacci( unsigned int n ){ if( n <= 0 ) return 0; if( n == 1 ) return 1; return Fibonacci( n - 1 ) + Fibonacci( n - 2 );}但使用递归时,Fibonacci( n - 1 ) + Fibonacci( n - 2 )前后两项在进行递归的过程中,会出现许多重复计算,效率很低(比如重复计算Fibonacci( n - 3 ), Fibonacci( n - 4 ).....)。可考虑使用循环实现,从下往... 阅读全文
posted @ 2012-09-17 21:06 糙哥 阅读(9321) 评论(0) 推荐(1) 编辑
摘要: 最近做的一些关于字符串操作的题目,发现其实很多操作都可以直接调用相关函数的,只是因为这些函数比较基础,所以会被直接拿来当笔试题。不过在解决稍复杂的一些问题时,直接调用函数比自己写一个省事多了。挑几个常用的写在这里。 strstr() 字符串查找函数 char* strstr( const char* haystack, const char* needle ); 从字符串haystack中搜寻字符串needle,并将其第一次出现的地址返回。 返回:指定字符串第一次出现的地址,否则返回0 strncpy() 复制字符串 char* strncpy( char... 阅读全文
posted @ 2012-09-14 15:18 糙哥 阅读(524) 评论(0) 推荐(0) 编辑
摘要: 使用字符串对大整数进行加法计算 发现单纯看代码是件很痛苦的事,虽然这个题目网上到处都是,可的确没有几个写得让人可以很顺畅的看下去,结果就是宁愿自己编个垃圾的,也不愿去看别人的代码(除非是大师级的,不过大师不会编这种简单的代码了吧····)。现在做的一些题目,都是看看大概思路,然后自己实现,实在遇到问题再去看别人的代码,不过就目前为止勉强都可以自己编着试试,毕竟还没有涉及到很复杂的算法。 要使用字符串进行加法,主要是要解决进位的问题。 先将两个字符串逆置,之后再逐位相加并存入另一个字符串中(相加过程中要检查是否有进位),最后将得到的字符串逆置就可以得到结果 阅读全文
posted @ 2012-09-13 17:26 糙哥 阅读(20565) 评论(0) 推荐(0) 编辑
摘要: 出处——《剑指offer》 题目:把一个数组最开始的若干个元素搬到数组的末尾,称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。 1.用遍历数组的方法来实现int MinInOrder( int num[], index1, index2 ) /*index1为数组起始位置,index2为数组终止位置*/{ int result = num[ index1 ]; int i; for( i = index1 + 1; i <= index2; i+... 阅读全文
posted @ 2012-09-12 17:08 糙哥 阅读(1015) 评论(0) 推荐(0) 编辑
摘要: 某公司的一道编程题(好像不提公司名比较好,不然总感觉怪怪的):对输入字符串进行压缩,输入"aaabcccdde",输出"3ab3c2de",即对连续出现的字符进行压缩。 如果数据结构是数组的话,主要是要解决两个问题,一是统计重复的字符,二是确定数组压缩后每个元素在数组中所处的位置。 可以用一个指针遍历数组,另一个指针标记存储位置。 (现在解决问题还是处于暴力解题阶段,性能鲁棒性什么的还都没考虑,一般也只懂得循环循环,得提高了!) void string_compress( char s[] ) { int i, j; int count; int len 阅读全文
posted @ 2012-09-11 15:10 糙哥 阅读(10659) 评论(0) 推荐(0) 编辑
摘要: 华为的一道比较基础的面试题,就是查找一个字符串中某个子字符串出现的次数,并只考虑最左对齐的情况。 如在"helloejesjhelloejedjshhello"中查找子字符串"hello"出现的次数。 最直接的方法是使用遍历实现。int string_find( char str[], char substr[] ){ int i, j, check ,count = 0; int len = strlen( str ); /*取得字符串长度,不包括'\0'*/ int sublen = strlen( substr ); for( i 阅读全文
posted @ 2012-09-10 15:56 糙哥 阅读(8623) 评论(0) 推荐(0) 编辑
摘要: 进行二分查找的前提是数组已排序,这里假定数组递增排序。每次查找都将待查找数num与处于数组中间位置a[mid]的数进行比较,num < a[mid]则在mid之前的元素中进行查找,反之在mid之后的元素中进行查找。在函数中使用low, mid, high来对待查找的范围来进行标记。/*整数查找*/void binsearch( int num, int a[], int length ) /*num为待查找数字,length为数组a的长度*/{ int low, mid, high; low = 0; high = length - 1; while( low <= high ). 阅读全文
posted @ 2012-09-10 14:57 糙哥 阅读(3500) 评论(1) 推荐(0) 编辑