2. 反转单词的两种解决方案

Jun 07, 2016 pm 03:48 PM
関数 言葉 逆行する 書く 解決

编写一个函数,反转一个字符串中单词的顺序。例如,函数应该将字符串Life is better and better.转换成better. and better is Life。假定所有的单词都是以空格分隔的,标点也作为字母一样处理。 1. 通用的解决方法 通用解决方案的工作原理如下: 首先,需要

    编写一个函数,反转一个字符串中单词的顺序。例如,函数应该将字符串“Life is better and better.”转换成“better. and better is Life”。假定所有的单词都是以空格分隔的,标点也作为字母一样处理。

 

    1. 通用的解决方法

    通用解决方案的工作原理如下:

    首先,需要分配适当大小的临时缓冲区。然后,需要进行扫描循环,从字符串的最后一个字符开始。当发现非单词字符时,可以将它直接写到缓冲区中去。但是,当发现单词字符时,不能立即将它写入临时缓冲区。因为是在反向扫描这个字符串,遇到的第一个字符,正好是这个单词的最后一个字符,所以如果按发现字符的顺序复制,会使每个单词中的字符发生反转。所以,需要继续扫描,直到找到这个单词的第一个字符,再将这个单词的每个字符以正确的、不反转的顺序进行复制。当复制一个单词的字符时,需要确定这个单词的结尾,这样才能知道何时停止复制。可以通过检查每个字符是否是单词字符来实现这一点,但因为已经知道了这个单词最后一个字符的位置,更好的方法是进行复制直至到达这个位置。

    程序代码如下:

    #include "stdafx.h"
    #include
    #include

    #include

 

    bool reverseWords(char str[])
    {
        char *buffer;
        int tokenReadPos, wordReadPos, wordEnd, writePos = 0;

 

        // Position of the last character is length - 1
        tokenReadPos = strlen(str) - 1;

        buffer = (char*)malloc(tokenReadPos + 2);


        if(!buffer)
            return false; // reverseWords failed

 

        while(tokenReadPos >= 0)
        {
            if(str[tokenReadPos] == ' ') // Non-word characters
            {
                // Write character
                buffer[writePos++] = str[tokenReadPos--];
            }
            else // Word character
            {
                // Store position of end of word
                wordEnd = tokenReadPos;

 

                // Scan to next non-word character
                while(tokenReadPos >= 0 && str[tokenReadPos] != ' ')
                    tokenReadPos--;

 

                // tokenReadPos went past the start of the word
                wordReadPos = tokenReadPos + 1;

 

                // Copy the characters of the word
                while(wordReadPos                 {
                    buffer[writePos++] = str[wordReadPos++];
                }
            }
        }

 

        // null terminate buffer and copy over str
        buffer[writePos] = '/0';


        strcpy(str, buffer);

 

        free(buffer);

 

        return true; // ReverseWords successful
    }

 

    int main()
    {
         char str[] = "Life is better and better!";

         cout          reverseWords(str);
         cout

         return 0;
    }

 

    程序的运行结果如下图所示:

2. 反转单词的两种解决方案

 

 

2. 专用的解决方法:

    专用解决方法的原理如下:

    首先,将整个字符串进行反转。然后,对反转后的每个单词进行反转。与通用解决方法相比,专用解决方法的好处是不需要缓冲区。 

    程序代码如下:

    #include "stdafx.h"
    #include
    #include

 

    void reverseString(char str[], int start, int end)
    {
        char temp;
        while(end > start)
        {
            // Exchange characters
            temp = str[start];
            str[start] = str[end];
            str[end] = temp;

 

            // Move indices towards middle
            start++; end--;
         }
     }

 

     void reverseWords(char str[])
     {
         int start = 0, end = 0, length;

 

         length = strlen(str);

 

         // Reverse entire string
         reverseString(str, start, length - 1);

 

         while(end          {
             if(str[end] != ' ') // Skip non-word characters
             {
                 // Save positions of beginning of word
                 start = end;

 

                 // Scan to next non-word character
                 while(end                      end++;

                 // Back up to end of word
                 end--;

 

                 // Reverse word
                 reverseString(str, start, end);
              }
              end++; // Advance to next token
         }

    }

 

    int main()
    {
        char str[] = "Life is better and better!";

        cout         reverseWords(str);
        cout

        return 0;
     }

 

    程序的执行结果如下:

2. 反转单词的两种解决方案

 

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C++ での機械学習アルゴリズムの実装: 一般的な課題と解決策 C++ での機械学習アルゴリズムの実装: 一般的な課題と解決策 Jun 03, 2024 pm 01:25 PM

C++ の機械学習アルゴリズムが直面する一般的な課題には、メモリ管理、マルチスレッド、パフォーマンスの最適化、保守性などがあります。解決策には、スマート ポインター、最新のスレッド ライブラリ、SIMD 命令、サードパーティ ライブラリの使用、コーディング スタイル ガイドラインの遵守、自動化ツールの使用が含まれます。実践的な事例では、Eigen ライブラリを使用して線形回帰アルゴリズムを実装し、メモリを効果的に管理し、高性能の行列演算を使用する方法を示します。

golang 関数で新しい関数を動的に作成するためのヒント golang 関数で新しい関数を動的に作成するためのヒント Apr 25, 2024 pm 02:39 PM

Go 言語は、クロージャとリフレクションという 2 つの動的関数作成テクノロジを提供します。クロージャを使用すると、クロージャ スコープ内の変数にアクセスでき、リフレクションでは FuncOf 関数を使用して新しい関数を作成できます。これらのテクノロジーは、HTTP ルーターのカスタマイズ、高度にカスタマイズ可能なシステムの実装、プラグイン可能なコンポーネントの構築に役立ちます。

C++ 関数の命名におけるパラメーターの順序に関する考慮事項 C++ 関数の命名におけるパラメーターの順序に関する考慮事項 Apr 24, 2024 pm 04:21 PM

C++ 関数の名前付けでは、読みやすさを向上させ、エラーを減らし、リファクタリングを容易にするために、パラメーターの順序を考慮することが重要です。一般的なパラメータの順序規則には、アクション-オブジェクト、オブジェクト-アクション、意味論的な意味、および標準ライブラリへの準拠が含まれます。最適な順序は、関数の目的、パラメーターの種類、潜在的な混乱、および言語規約によって異なります。

Java で効率的で保守しやすい関数を記述するにはどうすればよいでしょうか? Java で効率的で保守しやすい関数を記述するにはどうすればよいでしょうか? Apr 24, 2024 am 11:33 AM

効率的で保守しやすい Java 関数を作成するための鍵は、シンプルに保つことです。意味のある名前を付けてください。特殊な状況に対処します。適切な可視性を使用してください。

Excel関数の公式の完全なコレクション Excel関数の公式の完全なコレクション May 07, 2024 pm 12:04 PM

1. SUM 関数は、列またはセルのグループ内の数値を合計するために使用されます (例: =SUM(A1:J10))。 2. AVERAGE 関数は、列またはセルのグループ内の数値の平均を計算するために使用されます (例: =AVERAGE(A1:A10))。 3. COUNT 関数。列またはセルのグループ内の数値またはテキストの数をカウントするために使用されます。例: =COUNT(A1:A10)。 4. IF 関数。指定された条件に基づいて論理的な判断を行い、結果を返すために使用されます。対応する結果。

C++関数のデフォルトパラメータと可変パラメータの長所と短所の比較 C++関数のデフォルトパラメータと可変パラメータの長所と短所の比較 Apr 21, 2024 am 10:21 AM

C++ 関数のデフォルト パラメーターの利点には、呼び出しの簡素化、可読性の向上、エラーの回避などがあります。欠点は、柔軟性が限られていることと、名前の制限があることです。可変引数パラメーターの利点には、無制限の柔軟性と動的バインディングが含まれます。欠点としては、複雑さの増大、暗黙的な型変換、デバッグの難しさなどが挙げられます。

Java フレームワークのセキュリティ脆弱性の分析と解決策 Java フレームワークのセキュリティ脆弱性の分析と解決策 Jun 04, 2024 pm 06:34 PM

Java フレームワークのセキュリティ脆弱性を分析すると、XSS、SQL インジェクション、SSRF が一般的な脆弱性であることがわかりました。解決策には、セキュリティ フレームワークのバージョンの使用、入力検証、出力エンコーディング、SQL インジェクションの防止、CSRF 保護の使用、不要な機能の無効化、セキュリティ ヘッダーの設定が含まれます。実際のケースでは、ApacheStruts2OGNL インジェクションの脆弱性は、フレームワークのバージョンを更新し、OGNL 式チェック ツールを使用することで解決できます。

参照型を返す C++ 関数の利点は何ですか? 参照型を返す C++ 関数の利点は何ですか? Apr 20, 2024 pm 09:12 PM

C++ で参照型を返す関数の利点は次のとおりです。 パフォーマンスの向上: 参照による受け渡しによりオブジェクトのコピーが回避され、メモリと時間が節約されます。直接変更: 呼び出し元は、返された参照オブジェクトを再割り当てせずに直接変更できます。コードの簡素化: 参照渡しによりコードが簡素化され、追加の代入操作は必要ありません。

See all articles