天天看點

劍指offer之翻轉單詞順序

1 題目

輸入一個英文橘子,翻轉句子中的單詞順序,但是單詞内字元串的順序不變,簡單起見,标點符号和普通字元字母一樣處理,例如輸入字元串"I am a student.",則輸出"student. a am I"

2 思路

先反轉字元串所有,然後在反轉裡面的單詞,我們用兩個首尾指針操作

3 代碼實作

#include <stdio.h>
 
/*
 * 反轉整個字元串
 */
void reverse(char *begin, char *end)
{
    if (NULL == begin || NULL == end)
        return;
    while (begin < end)
    {
        char temp = *end;
        *end = *begin;
        *begin = temp;
        ++begin;
        --end;
    }
}
 
 
/*
 * 反轉字元串裡面的單詞
 */
char* reverseNumeber(char *str)
{
    if (NULL == str)
    {
        return NULL;
    }
    char *begin = str;
    char *end = str;
    while (*end != '\0')
    {
        end++;
    }
    --end;
    //反轉整個字元串
    reverse(begin, end);
    //再反轉裡面的單詞
    begin = end = str;
    while (*begin != '\0')
    {
        if (*begin == ' ')
        {
            begin++;
            end++;
        }
        else if (*end == ' ' || *end == '\0')
        {
            //如果這裡是用reverse(begin, end--)
            //那麼我們用' '和前面的指針替換,有問題。
            reverse(begin, --end);
            begin = ++end;
        }
        else
        {
            ++end;
        }
    }
    return str;
}
 
int main()
{
    char a[] = "chenyu word hello";
    char *result = NULL;
    result = reverseNumeber(a);
    if (NULL == result)
    {
        printf("result is NULL\n");
    }
    else
    {
        printf("%s\n", result);
    }
    return 0;
}      

4 運作結果

hello word chenyu      

繼續閱讀