您的位置:首页 > 职场人生

面试中经常出现的算法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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试 算法 C语言