算法练习 之0918

来源:互联网 发布:类的定义 c语言 编辑:程序博客网 时间:2024/05/17 19:14

第一题:

请实现一个算法改变一个整数的存储方式(低到高;高到低) 如0x12345678转成0x78563412

void reverse_dword(unsigned char* dwNum,int len)
{
    if (len<=1 || NULL == dwNum)
    {
        return ;
    }
    unsigned char dwTemp = *dwNum;
    *dwNum = *(dwNum + len -1);
     *(dwNum + len -1) = dwTemp;

     reverse_dword(dwNum+1,len -2);
}

正常一个dword是四个字节,dword* p 每次移动4个字节

转换成unsigned char*以后,每次p移动一个字节。

然后把第一个字节(12)和最后一个字节(78)顺序调换。

中间的(34)和(56)进行调换。

第二题:

实现char *strstr(const char *s1, const char *s2)
      strstr(“hello world”, “orl”)输出”orld”
      strstr(“hello world”, “xyz”)输出NULL

char *MyStrstr(char *dstStr, char *partenStr)
{
    //记录s1,s2的指针
    char* pStr = dstStr;
    char* pSubStr = NULL;
    char* pStrTemp = NULL;

    //判断partenStr为NULL
    if (!partenStr)
    {
        return pStr;
    }
    
    //外循坏的指针向前跑
    while (*pStr)
    {
        pStrTemp = pStr;
        pSubStr = partenStr;
        while (*pStrTemp && &*pSubStr)
        {
            if (*pStrTemp == *pSubStr)
            {
                pStrTemp++;
                pSubStr++;
            }
            else
            {
                break;
            }
        }

        //子串走到末尾
        if (*pSubStr == '\0')
        {
            return pStr;
        }
        
        pStr++;
    }
    return NULL;
}

这个没啥说的,效率比较低,有兴趣的小伙伴可以看下网上的KMP算法。

第三题:

将一个字符串按照单词逆置,如”hello world””world hello”

//旋转整个字符串
void ReverseSimple(char* pchWord, unsigned int nLen)
{
    if (NULL == pchWord)
    {
        return;
    }

    for (unsigned int nIndex = 0; nIndex < nLen/2; ++nIndex)
    {        char chTemp = pchWord[nIndex];
    pchWord[nIndex] = pchWord[nLen-1-nIndex];
    pchWord[nLen-1-nIndex] = chTemp;
    }
}

void ReverseByWord(char* pchSentence)
{
    if (NULL == pchSentence)
    {
        return;
    }

    //字符串整体逆置
    ReverseSimple( pchSentence, mystrlen(pchSentence) );

    //两个指针一前一后
    char *pFirst , *pSecond = pchSentence;

    while(' ' == *pSecond)
    {
        ++pSecond;
    }

    if ('\0' == *pSecond)
    {
        return;
    }

    pFirst = pSecond;

    for ( ; *pSecond != '\0'; ++pSecond)
    {
        if (*pSecond != ' ')
        {
            continue;
        }


        ReverseSimple( pFirst, pSecond - pFirst );

        //再寻找下一个单词的开始位置,以空格作为判断
        while(' ' == *pSecond)
            ++pSecond;

        if ('\0' == *pSecond)
        {
            break;
        }

        pFirst = pSecond;
    }
    ReverseSimple(pFirst,pSecond - pFirst);
}

计算一个整数的二进制中有多少个1

思路:整数n,n = n&(n-1)  能去掉n二进制中末尾的1,从而来统计1的个数。

0 0
原创粉丝点击