算法问题
Cbird-coder
将这人工智障的时代拉回正轨
展开
-
寻找字符串中第一个未重复的字符
设想这样一个场景,有一天你黑进去一个Server,获取的是普通用户权限,但是你在普通用户根目录下发现一个README文件,上面写着要获取server的管理员口令,在当前用户的根文件目录下有个文件,获取文件每一行第一个未重复的字符,一共有20行,最后这20个字符组成的就是这个系统的根口令。这里需要注意的是,口令中不能含有控制符号与空格符号,所以需要对文件进行过滤。分析这个问题后,我们需要进行两步原创 2015-08-13 11:10:25 · 882 阅读 · 0 评论 -
字符串循环移位
void moveloop(char *str,int step){ int i=0,j=0,k=0; int len=strlen(str); j=step%len; char* temp=(char*)malloc(len+1); while(j<len) { temp[j]=str[i]; i++; j++; } while(i<len) { temp[k原创 2015-09-12 16:09:13 · 423 阅读 · 0 评论 -
字符串分割
字符串分割时候,会采用两种思想,一种是直接使用C自带的分割函数strtok,其原型如下:char *strtok(char s[], const char *delim);其中s[ ]为要分割的字符串,*delim为分割符。首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。strtok在s中查找包含在delim中的字符并用NULL('/0')来替换,直到找遍整个字符串。原创 2015-06-27 11:56:18 · 802 阅读 · 0 评论 -
大数运算问题
C/C++编程中,过于大的两个数运算会存在溢出的问题,详细了解可看本博客此处。那怎么运算特别大的数据而不越界溢出呢?以32位机器为例最大的数为0xFFFFFFFF。如果两个数运算如果大于这个数,则会回绕,超出32位的部分被截断,导致实际得到数远远小于想得到的数字。判断溢出的方法在溢出问题中已经详细说明了。首先是计算一下两个不超出0xFFFFFFFF的值的平均值,面试的时候我的思路是对的,貌原创 2015-07-24 22:21:34 · 689 阅读 · 0 评论 -
字符串基本处理算法
最近想写写字符串处理方面的东西。前面已经写写了字符串分割函数的实现。下面再将几种常见的字符串处理算法实现了下。第一个为统计字符串的长度函数,很简单,定义一个指针指向字符串首位,然后从头遍历到字符串的尾部,遇到'\0'就停止,同时定义一个变量累加。下面直接贴代码:int stringlen(char *str){ int length=0; while(*str++!='\0')原创 2015-06-27 17:32:40 · 874 阅读 · 2 评论 -
字符串全排列问题
这几天一直在思考一个问题,一个字符串的排列方式有多少种?正好有阿里巴巴校园招聘的一道题目:问“alibaba”这个字符串的排列方式有多少种?看到这个问题,排列这个字眼,是不是有点眼熟,是啊!高二时候学习的排列组合问题,概率里面的。这算算都快10年过去了。这里我们利用排列组合的问题解决这个问题。看了下这个字符串,一共有7个字符,字符'a'出现了三次,字符'b'出现了2次,剩下了'l'原创 2015-07-02 15:38:37 · 938 阅读 · 0 评论 -
递归实现字符串反转算法
使用递归实现字符串反转,下面算法的复杂度为O(n),由内层递归向外依次打印可以逐步实现字符串的反转。算法的C代码如下:void RevString(char *s) { if(s[0] == '\0') return; if(s[1] == '\0') putchar(s[0]); else { Rev原创 2015-03-10 17:33:22 · 2696 阅读 · 0 评论 -
计算子串在主串中的位置及其优化(KMP算法)
问题描述:设置一个起始位置,寻找主串中第一次出现子串的首位置。算法实现:int index(string str,string substr,int pos){ int i=0,j=0; int slen,sslen; i=pos; slen=str.length(); sslen=substr.length(); while(i+sslen<slen) { whi原创 2015-08-26 20:27:24 · 5319 阅读 · 0 评论 -
Linux下wc工具的简单实现
wc工具是Linux下一款强大的统计字符数,单词数,行数的工具。其实实现挺简单的。我做了一简单的实现:#include#include#define LEN 4096int text_c(FILE *fp){ char buffer[LEN]; int i=0,count=0; while(fgets(buffer,LEN,fp)!=NULL) { while(buf原创 2015-08-13 12:14:31 · 1326 阅读 · 0 评论 -
利用辗转相除法计算最大公约数与最小公倍数
google的一道面试题目,两个数字m,n,其取值的范围为0~100000.怎么求这两个数的最大公约数与最小公倍数。首先想到地就是辗转相除法来求解这道题目。算法思想如下:设两数为a、b(a>b),求a和b最大公约数(a,b)的步骤如下:用a除以b,得a÷b=q......r1(0≤r1)。若r1=0,则(a,b)=b;若r1≠0,则再用b除以r1,得b÷r1=q......r2 (0≤原创 2015-09-17 15:50:31 · 1294 阅读 · 0 评论