题目四:替换空格

Posted yzdai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题目四:替换空格相关的知识,希望对你有一定的参考价值。

//////////////////////////////////////////////////////////////////////////////
// 6.题目四:替换空格
// 请实现一个函数,把字符串中每个空格替换成"%20";例如输入:"We Are Happy!" --> "We%20Are%20Happy!"
//时间复杂度O(n), 空间复杂度O(1)

char* StrReplace(char* pszStr, int iLen, char ch, const char* pszReStr)

    assert(pszStr != NULL && pszReStr != NULL &&iLen >= 0);

    char* pTmp = pszStr;
    int iFindNum = 0;

    // 1.查找字符串中ch个数
    while (*pTmp != \0)
    
        if (*pTmp++ == ch)
        
            iFindNum++;
        
    

    // 2.新字符串长度
    int iOldLen = strlen(pszStr);
    int iReLen = strlen(pszReStr);
    int iNewLen = iOldLen + (iReLen - 1)* iFindNum; // 这里减1 待替换字符串长度 - 原来字符长度
    if (iNewLen > iLen)
    
        return NULL;
    

    // 3.从后往前赋值字符串
    // 这里为什么不用 i = iOldLen - 1;  --> 复制最后的‘\0‘;
    for (int i = iOldLen; i >= 0 && iNewLen > i; i--)
    
        if (pszStr[i] == ch)
        
            for (int j = iReLen - 1; j >= 0; j--)
            
                pszStr[iNewLen--] = pszReStr[j];
            
        
        else
        
            pszStr[iNewLen--] = pszStr[i];
        
    

#if 0
    while (iOldLen >= 0 && iNewLen > iOldLen)
    
        if (pszStr[iOldLen] == ch)
        
            for (int i = iReLen - 1; i >= 0; i--)
            
                pszStr[iNewLen--] = pszReStr[i];
            
        
        else
        
            pszStr[iNewLen--] = pszStr[iOldLen];
        

        iOldLen--;
    

#endif

    return pszStr;



void StrReplaceTestFunc()

    cout << "\n\n --------------- StrReplaceTestFunc Start -------------->" << endl;

    const int MAX_STR_LEN = 128;
    char szStr[MAX_STR_LEN] = "We Are Happy !";

    StrReplace(szStr, MAX_STR_LEN,  , "%20");

    cout << "Str: " << szStr << endl;

    StrReplace(szStr, MAX_STR_LEN, !, "------->");

    cout << "Str: " << szStr << endl;

    cout << "\n\n --------------- StrReplaceTestFunc End -------------->" << endl;


///////////////////////////////////////////////////////////////////
// 2. 与题目四相关题目
// 有两个排序数组A1, A2, A1的末尾有足够多的的空间容纳A2,实现一个函数,把A2中所有数字插入A1中且所有的数字的有序的!

//方法一:从前往后比较,需要额外的空间
//时间复杂度O(2n), 空间复杂度O(n)
void MergeTwoArray1(int aiArrayA[], int iNumA, int aiArrayB[], int iNumB)

    const int MAX_ARRAY_COUNT = iNumA + iNumB;
    vector<int> vect(MAX_ARRAY_COUNT, 0);

    int i = 0, j = 0, k = 0;
    
    // 1. 比较两个数组,把较小的加入新的数组
    while (i < iNumA &&j < iNumB)
    
        if (aiArrayA[i] < aiArrayB[j])
        
            vect[k++] = aiArrayA[i++];
        
        else
        
            vect[k++] = aiArrayB[j++];
        
    

    // 2.把剩余的元素加到新数组
    while (i < iNumA)
    
        vect[k++] = aiArrayA[i++];
    

    while (j < iNumB)
    
        vect[k++] = aiArrayB[j++];
    

    // 3.把数据复制到数组A
    k = 0;
    for (auto it : vect)
    
        aiArrayA[k++] = it;
    


// 方法二:从后往前比较,不需要额外的空间
//时间复杂度O(n), 空间复杂度O(1)
void MergeTwoArray2(int aiArrayA[], int iNumA, int aiArrayB[], int iNumB)

    int iNewNum = iNumA + iNumB - 1;
    int i = iNumA - 1;
    int j = iNumB - 1;
    
    // 从数组后往前比较,就不存在重叠的情况了!!!
    while (i >= 0 && j >= 0)
    
        if (aiArrayA[i] > aiArrayB[j])
        
            aiArrayA[iNewNum--] = aiArrayA[i--];
        
        else
        
            aiArrayA[iNewNum--] = aiArrayB[j--];
        
    

    while (i >= 0)
    
        aiArrayA[iNewNum--] = aiArrayA[i--];
    

    while (j >= 0)
    
        aiArrayA[iNewNum--] = aiArrayB[j--];
    



void MergeTwoArrayTestFunc()

    cout << "\n\n --------------- MergeTwoArrayTestFunc Start -------------->" << endl;
    const int MAX_ARRAY_COUNT_A = 30;
    const int MAX_ARRAY_COUNT_B = 10;

    int aiArrayA[MAX_ARRAY_COUNT_A] = 0;
    int aiArrayB[MAX_ARRAY_COUNT_B] = 0;

    INITIALIZE_ARRAY(aiArrayA, MAX_ARRAY_COUNT_B);
    INITIALIZE_ARRAY(aiArrayB, MAX_ARRAY_COUNT_B);

    std::sort(aiArrayA, aiArrayA + MAX_ARRAY_COUNT_B);
    std::sort(aiArrayB, aiArrayB + MAX_ARRAY_COUNT_B);

    TRAVERSAL_ARRAY(aiArrayA, MAX_ARRAY_COUNT_B);
    TRAVERSAL_ARRAY(aiArrayB, MAX_ARRAY_COUNT_B);

    //MergeTwoArray1(aiArrayA, MAX_ARRAY_COUNT_B, aiArrayB, MAX_ARRAY_COUNT_B);
    MergeTwoArray2(aiArrayA, MAX_ARRAY_COUNT_B, aiArrayB, MAX_ARRAY_COUNT_B);


    TRAVERSAL_ARRAY(aiArrayA, MAX_ARRAY_COUNT_A);

    cout << "\n\n --------------- MergeTwoArrayTestFunc Start -------------->" << endl;

以上是关于题目四:替换空格的主要内容,如果未能解决你的问题,请参考以下文章

求替换空格

剑指offer——替换空格

剑指offer——替换空格

剑指 Offer 05. 替换空格

替换空格为%20

2.替换空格