面试中经常出现的算法2(整理)
2015-08-11 14:08
417 查看
//出现次数相当频繁 //实现strcmp函数 int strcmps(char* l,char* r) { //assert(l!=0&&r!=0); while(*l == *r &&*l != '\0') l++,r++; if(*l > *r) return 1; else if(*l == *r) return 0; return -1; }
//实现字符串翻转 不使用strlen函数 char *strrev (char * string) { char *start = string; char *left = string; char ch; //使string指向最后一个字符 while (*string++) ; string -= 2;// ‘lastchar’ ‘\0’ ‘NULL’ while (left < string) { ch = *left; *left++ = *string; *string-- = ch; } return(start); }
//将一个单链表逆序 void reserve(Node* phead) { Node* p = phead->next;//第一个节点 if(p == NULL || p->next == NULL) return; //只有头节点或一个节点 Node* p1=p->next;//下一个节点 p->next=NULL;//新链表尾赋空 while(p1!=NULL) { p = p1->next;//保留链表 //把新节点移到开头 p1->next = phead->next; phead->next = p1; //p1重新指向链表 p1 = p; } }
//将一个数字字符串转换为数字."1234" -->1234 int atoii(char* s) { //assert(s!=NULL); int num = 0; while(*s>'0' && *s<'9') { num *= 10; num += *s-'0'; s++; } return num; }
//实现任意长度的整数相加 void bigadd(char* num,char* str,int len) { for(int i=len;i>0;i--) { num[i] += str[i]; int j = i; while(num[j]>=10) { num[j--] -= 10; num[j] += 1; } } }
//写函数完成内存的拷贝 (重点:覆盖)技巧:循环展开 void* memcpy( void *dst, const void *src, unsigned int len ) { register char *d; register char *s; if (len == 0) return dst; if ( dst > src ) //考虑覆盖情况 { d = (char *)dst + len - 1; s = (char *)src + len - 1; while ( len >= 4 ) //循环展开,提高执行效率 { *d-- = *s--; *d-- = *s--; *d-- = *s--; *d-- = *s--; len -= 4; } while ( len-- ) { *d-- = *s--; } } else if ( dst < src ) { d = (char *)dst; s = (char *)src; while ( len >= 4 ) { *d++ = *s++; *d++ = *s++; *d++ = *s++; *d++ = *s++; len -= 4; } while ( len-- ) { *d++ = *s++; } } return dst; }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua和C语言的交互详解
- PHP程序员面试 切忌急功近利(更需要注重以后的发展)
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 关于C语言中参数的传值问题
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言内存对齐实例详解
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- 探讨C语言的那些小秘密之断言
- 浅析STL中的常用算法