面试中经常出现的算法2(整理)

//出现次数相当频繁
//实现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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值