【C++】B2122 單詞翻轉


在這里插入圖片描述

博客主頁: [小????????]
本文專欄: C++

文章目錄

  • 💯前言
  • 💯題目描述
    • 輸入格式
    • 輸出格式
    • 樣例 #1
      • 樣例輸入 #1
      • 樣例輸出 #1
  • 💯一、我的做法
    • 代碼實現:
    • 代碼解析
    • 思路分析
  • 💯二、老師的第一種做法
    • 代碼實現:
    • 代碼解析
    • 思路分析
  • 💯三、C++ `reverse` 函數介紹
    • `reverse` 函數原型:
    • 示例:
    • 優點
  • 💯四、老師的第二種做法:使用 `reverse` 函數
    • 代碼實現:
    • 代碼解析
    • 思路分析
  • 💯五、對比分析
  • 💯六、拓展
  • 💯小結
    • 最開始的解法不通過
    • 老師優化后通過


在這里插入圖片描述


💯前言

  • 在計算機科學中,字符串處理是一個非常基礎且常見的任務。本題主要圍繞如何將一個句子中的每個單詞反轉來進行練習。這個問題不僅考察了對字符串操作的理解,還涉及了不同的解決方法。在本篇文章中,我們將詳細探討我自己的做法、老師提出的兩種做法,并深入講解C++中 reverse 函數的使用,最后通過對比和拓展分析這些方法的優缺點。
    C++ 參考手冊
    在這里插入圖片描述

💯題目描述

B2122 單詞翻轉
在這里插入圖片描述

小明同學寫單詞的時候喜歡反著寫,比如 hello 他會寫成 olleh。給出小明同學寫的一個句子,請你將所有的單詞復原。

輸入格式

共一行,一個字符串表示句子,單詞之間以空格分隔。

輸出格式

每個單詞一行。

樣例 #1

樣例輸入 #1

olleh dlrow

樣例輸出 #1

hello
world

💯一、我的做法

代碼實現:

#include <iostream>
#include <string>
using namespace std;int main()
{string s;while(cin >> s){for(int i = s.size() - 1; i >= 0; i--){cout << s[i];}cout << endl;}return 0;
}

代碼解析

在這個實現中,我選擇了通過手動反轉每個單詞的字符來恢復正確的單詞順序。

  1. 變量聲明

    • string s;:聲明一個字符串變量 s 用于存儲從輸入中讀取的每個單詞。
  2. 讀取輸入

    • while(cin >> s):使用 cin >> s 讀取一個單詞,直到沒有更多輸入。
  3. 反轉每個單詞

    • for(int i = s.size() - 1; i >= 0; i--):我們使用一個從單詞末尾到開頭的 for 循環,通過訪問每個字符并逆序輸出,來實現反轉操作。
  4. 輸出每個單詞

    • cout << s[i];:逐個輸出反轉后的字符。
  5. 換行

    • 每個單詞輸出后,使用 cout << endl; 換行,確保每個單詞占一行。

思路分析

這段代碼通過遍歷每個字符并從末尾到開頭進行輸出來實現反轉。通過這種手動操作字符的方式,能夠準確地完成任務。它的優點是直接且易于理解,但缺點是代碼稍顯冗長,且沒有利用C++標準庫提供的便捷工具。


💯二、老師的第一種做法

老師給出的第一種做法是通過手動交換字符串中的字符來反轉單詞。下面是老師的代碼實現:

代碼實現:

#include <iostream>
#include <cstring>
using namespace std;int main()
{string str;while(cin >> str){int left = 0;int right = str.size() - 1;while(left < right){char tmp = str[left];str[left] = str[right];str[right] = tmp;left++;right--;}cout << str << endl;}return 0;
}

代碼解析

老師的做法同樣采用了字符交換的方式來反轉每個單詞。其關鍵點在于通過兩個指針從字符串的兩端向中間移動,交換字符,直到完成反轉。

  1. 初始化兩個指針

    • int left = 0; int right = str.size() - 1;leftright 分別是指向字符串開始和結束的兩個指針。
  2. 交換字符

    • char tmp = str[left]; str[left] = str[right]; str[right] = tmp;:通過一個臨時變量 tmp 來交換 str[left]str[right]
  3. 逐步移動指針

    • left++right--:交換后,left 指針向右移動,right 指針向左移動,逐步將字符串反轉。
  4. 輸出反轉后的字符串

    • cout << str << endl;:輸出反轉后的單詞。

思路分析

老師的做法通過交換字符來反轉字符串,使用了雙指針的技巧,這種方法比我的做法更具效率,因為它只需要一次遍歷,每次只交換兩個字符。相比手動逐個輸出字符,這種方法更符合常見的反轉思路,代碼更簡潔。


💯三、C++ reverse 函數介紹

在C++標準庫中,提供了一個名為 reverse 的函數,它可以輕松地反轉一個容器(例如字符串、數組等)的元素順序。該函數位于 <algorithm> 頭文件中,使用時非常方便。

reverse 函數原型:

void reverse(BidirectionalIterator first, BidirectionalIterator last);
  • first:指向待反轉區間的起始元素的迭代器。
  • last:指向待反轉區間的結束元素的迭代器。

該函數會反轉區間 [first, last) 中的元素。

示例:

string s = "abcd";
reverse(s.begin(), s.end());
cout << s << endl; // 輸出 "dcba"

優點

  • 簡潔:C++ reverse 函數將反轉操作封裝得非常簡潔。只需調用一次 reverse,就能完成字符串或數組的反轉,代碼更加清晰易懂。
  • 高效reverse 內部實現通常采用類似于雙指針交換的方式,性能非常高。

💯四、老師的第二種做法:使用 reverse 函數

老師的第二種做法直接利用了 C++ STL 中的 reverse 函數,這使得反轉操作變得更加簡便。

代碼實現:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;int main()
{string str;while (cin >> str){reverse(str.begin(), str.end());cout << str << endl;}return 0;
}

代碼解析

這段代碼通過 reverse 函數反轉字符串:

  1. 使用 reverse 函數

    • reverse(str.begin(), str.end());:直接使用 reverse 函數來反轉字符串 str
  2. 輸出反轉后的字符串

    • cout << str << endl;:輸出每個反轉后的單詞,并換行。

思路分析

這種做法通過使用 C++ STL 中的現成函數來簡化代碼。reverse 函數提供了高效且簡潔的反轉操作,比手動交換字符或逐個輸出字符的方法要簡單得多。


💯五、對比分析

  1. 我的做法

    • 優點:代碼簡單,容易理解,適用于初學者。
    • 缺點:冗長,效率較低,特別是手動反轉每個字符時,不夠高效。
  2. 老師的第一種做法

    • 優點:通過雙指針交換字符,比手動輸出字符更高效。
    • 缺點:代碼較為復雜,理解起來可能稍微困難。
  3. 老師的第二種做法

    • 優點:使用 reverse 函數,代碼最簡潔,符合C++的標準庫優勢,效率高。
    • 缺點:可能需要對 reverse 函數有一定的了解。

💯六、拓展

除了 reverse 函數外,我們還可以用其他方式來處理字符串或數組的反轉操作:

  1. 利用棧:將字符壓入棧中,然后從棧中彈出字符來實現反轉。
  2. 遞歸:通過遞歸函數逐步將字符串或數組的字符進行反轉。

💯小結

通過對比不同的做法,我們可以看到,C++提供了多種有效的反轉策略。通過手動字符交換、使用 reverse 函數,甚至使用 STL 容器的其他方法,我們可以靈活地選擇最適合問題需求的解決方案。在實際開發中,選擇合適的工具和方法,不僅能提高代碼的可讀性,還能提高程序的效率。


在這里插入圖片描述


在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述

最開始的解法不通過

#include <iostream>
#include <string>
using namespace std;int main()
{string s;getline(cin, s);int i = 0;int index = 0;for(i = 0; i < s.size(); i++){if(s[i] == ' '){for(int j = i - 1; j >= index; j--)cout << s[j];cout << endl;index = i + 1;	}else if(i == s.size() - 1){for(int j = i; j >= index; j--)cout << s[j];cout << endl;}	} return 0;
}

在這里插入圖片描述

老師優化后通過

#include <iostream>
#include <string>
using namespace std;int main()
{string s;getline(cin, s);int i = 0;int index = 0;for (i = 0; i < s.size() - 1; i++){if (s[i] == ' '){for (int j = i - 1; j >= index; j--){cout << s[j];}cout << endl;index = i + 1;}else if (i == s.size() - 2){for (int j = i; j >= index; j--){cout << s[j];}cout << endl;}}return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67893.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67893.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67893.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

麥芯(MachCore)應用開發教程5 --- 工位和晶圓傳輸

麥芯是構建在windows系統上的設備應用操作系統&#xff0c;利用該系統可以快速高效的開發一款設備專用軟件。希望進一步了解請email: acloud163.com 黃國強 2025/02/03 一、工位與子設備的關系 想象工廠中的流水線工作站&#xff0c;每個工位&#xff08;Station&#xff09…

Python從0到100(八十七):CNN網絡詳細介紹及WISDM數據集模型仿真

前言&#xff1a; 零基礎學Python&#xff1a;Python從0到100最新最全教程。 想做這件事情很久了&#xff0c;這次我更新了自己所寫過的所有博客&#xff0c;匯集成了Python從0到100&#xff0c;共一百節課&#xff0c;幫助大家一個月時間里從零基礎到學習Python基礎語法、Pyth…

C++ Primer 迭代器

歡迎閱讀我的 【CPrimer】專欄 專欄簡介&#xff1a;本專欄主要面向C初學者&#xff0c;解釋C的一些基本概念和基礎語言特性&#xff0c;涉及C標準庫的用法&#xff0c;面向對象特性&#xff0c;泛型特性高級用法。通過使用標準庫中定義的抽象設施&#xff0c;使你更加適應高級…

【C++篇】位圖與布隆過濾器

目錄 一&#xff0c;位圖 1.1&#xff0c;位圖的概念 1.2&#xff0c;位圖的設計與實現 1.5&#xff0c;位圖的應用舉例 1.4&#xff0c;位圖常用應用場景 二&#xff0c;布隆過濾器 2.1&#xff0c;定義&#xff1a; 2.2&#xff0c;布隆過濾器的實現 2.3&#xff0c; 應…

VR觸感數據手套:觸感反饋賦予虛擬交互沉浸式體驗

隨著動作捕捉技術的蓬勃發展&#xff0c;動捕數據手套成為了手部動作捕捉與虛擬交互的便捷工具&#xff0c;為人們打開了通往虛擬世界的新大門。在眾多產品中&#xff0c;mHand Pro作為一款多功能兼具的VR動作捕捉數據手套&#xff0c;憑借其卓越的性能&#xff0c;在手部動作捕…

C# 結構體介紹

.NET學習資料 .NET學習資料 .NET學習資料 一、結構體的定義與基本使用 &#xff08;一&#xff09;定義結構體 在 C# 中&#xff0c;使用struct關鍵字來創建結構體。它就像是一個模板&#xff0c;能定義出符合特定需求的數據結構。比如&#xff0c;若要跟蹤圖書館中書的信息…

圖像噪聲處理技術:讓圖像更清晰的藝術

在這個數字化時代&#xff0c;圖像作為信息傳遞的重要載體&#xff0c;其質量直接影響著我們的視覺體驗和信息解讀。然而&#xff0c;在圖像采集、傳輸或處理過程中&#xff0c;難免會遇到各種噪聲干擾&#xff0c;如高斯噪聲、椒鹽噪聲等&#xff0c;這些噪聲會降低圖像的清晰…

追逐低空經濟,無人機研學技術詳解

追逐低空經濟&#xff0c;無人機研學技術成為了一個備受關注的領域。以下是對無人機研學技術的詳細解析&#xff1a; 一、無人機研學技術概述 無人機研學技術是以無人機為核心&#xff0c;結合航空科技、電子技術、機械原理等多領域知識的一種教育實踐活動。它旨在通過理論學習…

(done) MIT6.S081 2023 學習筆記 (Day7: LAB6 Multithreading)

網頁&#xff1a;https://pdos.csail.mit.edu/6.S081/2023/labs/thread.html (任務1教會了你如何用 C 語言調用匯編&#xff0c;編譯后鏈接即可) 任務1&#xff1a;Uthread: switching between threads (完成) 在這個練習中&#xff0c;你將設計一個用戶級線程系統中的上下文切…

Kubernetes學習之通過Service訪問Pod

一、基礎概述 1.當通過deployment等controller動態創建和銷毀pod使得每個pod都有自己的ip地址&#xff0c;當controller用新的pod替代發生故障的pod時&#xff0c;新的pod會分配到新的ip地址&#xff0c;那么客戶端如何穩定的找到并訪問pod提供的服務。 2.創建service service從…

【優先算法】專題——前綴和

目錄 一、【模版】前綴和 參考代碼&#xff1a; 二、【模版】 二維前綴和 參考代碼&#xff1a; 三、尋找數組的中心下標 參考代碼&#xff1a; 四、除自身以外數組的乘積 參考代碼&#xff1a; 五、和為K的子數組 參考代碼&#xff1a; 六、和可被K整除的子數組 參…

CDDIS從2025年2月開始數據遷移

CDDIS 將從 2025 年 2 月開始將我們的網站從 cddis.nasa.gov 遷移到 earthdata.nasa.gov&#xff0c;并于 2025 年 6 月結束。 期間可能對GAMIT聯網數據下載造成影響。

谷歌Titans模型論文解析,Transformer迎來變革拐點——DeepSeek能否“接招”?

一、引入 Titans 模型 我們將深入探討谷歌研究院的一篇新論文《Titans: Learning to Memorize at Test Time》&#xff0c;該論文介紹了一種名為 Titans 的新模型架構。 Titans 在緩解 Transformer 二次方成本問題的同時&#xff0c;展現出了令人期待的成果。Titans 模型的設…

新春賀歲,共赴AGI之旅

點擊藍字 關注我們 AI TIME歡迎每一位AI愛好者的加入&#xff01; 往期精彩文章推薦 季姮教授獨家文字版干貨 | 面向知識淵博的大語言模型 關于AI TIME AI TIME源起于2019年&#xff0c;旨在發揚科學思辨精神&#xff0c;邀請各界人士對人工智能理論、算法和場景應用的本質問題…

Baklib推動數字化內容管理解決方案助力企業數字化轉型

內容概要 在當今信息爆炸的時代&#xff0c;數字化內容管理成為企業提升效率和競爭力的關鍵。企業在面對大量數據時&#xff0c;如何高效地存儲、分類與檢索信息&#xff0c;直接關系到其經營的成敗。數字化內容管理不僅限于簡單的文檔存儲&#xff0c;更是整合了文檔、圖像、…

【memgpt】letta 課程4:基于latta框架構建MemGpt代理并與之交互

Lab 3: Building Agents with memory 基于latta框架構建MemGpt代理并與之交互理解代理狀態,例如作為系統提示符、工具和agent的內存查看和編輯代理存檔內存MemGPT 代理是有狀態的 agents的設計思路 每個步驟都要定義代理行為 Letta agents persist information over time and…

測試方案和測試計劃相同點和不同點

在軟件測試領域&#xff0c;測試方案與測試計劃皆為舉足輕重的關鍵文檔&#xff0c;盡管它們有著緊密的關聯&#xff0c;但在目的與內容層面存在著顯著的差異。相同點&#xff1a; 1.共同目標&#xff1a;測試方案和測試計劃的核心目標高度一致&#xff0c;均致力于保障軟件的…

詳細介紹:網站背景更換功能

目錄 1. HTML 部分 2. JavaScript 部分 3. 完整流程 4. 總結 5. 適用場景 本文將介紹如何通過文件上傳實現網站背景圖片的更換。通過使用 JavaScript 和 Axios&#xff0c;我們可以允許用戶上傳圖片文件并將其作為網站的背景圖片。上傳的圖片 URL 會保存在瀏覽器的 localSt…

嵌入原則:數據特征如何 融入 模型的 損失地形

嵌入原則&#xff1a;數據特征如何 融入 模型的 損失地形 第一節&#xff1a;嵌入原則的基本概念與公式解釋 機器學習中的嵌入原則&#xff0c;就像 “雕刻師” 將 “石塊的紋理” 逐漸融入到 “雕塑的造型” 中。數據特征不再是獨立的輸入&#xff0c;而是被模型 “吸收” 和…

FPGA|例化生成的PLL功能IP核

1、例化上一篇文章中調用的IP核&#xff0c;新建文件PLL_test.v 2、代碼如圖 timescale 1ns / 1ps module PLL_test(input clk,input rst_n,output clkout0,output clkout1,output clkout2,output clkout3,output clkout4);wire locked;PLL pll_inst(.inclk0(clk),.c0(clkout0)…