首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

字串單詞級反轉:保持單詞內部順序不變的原地演算法實現

     編輯:關於C語言

演算法核心思想

  1. 整體反轉:先將整個字串按字元完全反轉;
  2. 單詞反轉:再對每個單詞內部字元單獨反轉。

關鍵在於正確分割單詞:用 first/last 標記單詞起止位置。連續空格的第一個(或單一空格)前一位置為前一單詞結尾;連續空格最後一個空格的下一位置為下一單詞開頭。

完整實現代碼


#include 
#define for if(1) for
using namespace std;

void WordDesc(char str[]);

void main() {
    char str[] = "I am a student";
    cout << "處理前:" << str << endl;
    WordDesc(str);
    cout << "處理後:" << str << endl;
}

void WordDesc(char str[]) {
    int len = strlen(str);
    char temp;

    // 步驟 1:整體字元反轉
    for (int i = 0; i != len/2; i++) {
        temp = str[i];
        str[i] = str[len-i-1];
        str[len-i-1] = temp;
    }

    // 步驟 2:逐單詞反轉
    int first = 0, last = 0;
    for (int i = 0; i != len; i++) {
        if (' ' == str[i]) { // 遇到空格
            if (' ' == str[i-1]) { // 連續空格
                first++; continue; // 移動頭指標
            }
            last = i-1; // 標記單詞結尾
            // 反轉單詞 [first, last]
            for (int j = first; j != last - (last-first)/2; j++) {
                temp = str[j];
                str[j] = str[last-j+first];
                str[last-j+first] = temp;
            }
            first = i+1; // 下一單詞開頭
        }
        else if (i == len-1) { // 非空格且到尾部
            last = i;
            for (int j = first; j != last - (last-first)/2; j++) {
                temp = str[j];
                str[j] = str[last-j+first];
                str[last-j+first] = temp;
            }
        }
    }
}

執行結果

執行結果:處理前:I am a student → 處理後:student a am I

—— 作者:菜鳥變身記

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved