seansie's blog

Zerojudge a022. 迴文 C++多種方法的題解

‘Zerojudge a022. 迴文題目連結

法一 內建函數

//	AC (2ms, 332KB)
#include <bits/stdc++.h>
using namespace std;

int main() {
  string s;
  while (cin >> s) {
    string t = s; // Create a copy of s
    reverse(t.begin(), t.end());
    cout << ((s == t) ? "yes" : "no");
  }
  return 0;
}

程式碼分析

  1. 包含函式庫
#include <bits/stdc++.h>
using namespace std;

此段程式碼包含了 C++ 標準函式庫中的所有頭文件,並使用 using namespace std; 語句將函式庫中的函式引入到全局範圍內。

  1. 宣告變數
string s;

此行程式碼宣告了一個名為 s 的字串變數。

  1. 輸入字串
while (cin >> s) {

此段程式碼使用 cin 函式從標準輸入設備中讀取一個字串並將其存儲在 s 變數中。while 迴圈將不斷執行,直到讀取到空字串為止。

  1. 建立反向字串
string t = s; // Create a copy of s
reverse(t.begin(), t.end());

此段程式碼首先建立一個名為 t 的字串變數,並將 s 變數的值複製到 t 變數中。然後,使用 reverse 函式將 t 變數中的字元順序反轉。

  1. 判斷是否為迴文
cout << ((s == t) ? "yes" : "no");

此段程式碼使用 == 運算子比較 s 變數和 t 變數的值。如果它們相等,則表示 s 變數是一個迴文,並輸出 “yes”;否則,則表示 s 變數不是一個迴文,並輸出 “no”。

在上述程式碼中,三元運算子被用於判斷 s 變數和 t 變數的值是否相等。以下是三元運算子的語法:

條件 ? 真實值 : 假設值

在上述程式碼中,三元運算子被用於以下語句:

C++

cout << ((s == t) ? "yes" : "no");

此語句的解析如下:

  • s == t 是條件運算子的條件部分。如果該條件為真,則表示 s 變數和 t 變數的值相等。
  • "yes" 是條件為真時的真實值。
  • "no" 是條件為假時的假設值。

因此,如果 s 變數和 t 變數的值相等,則輸出 “yes”;否則,輸出 “no”。

三元運算子是一種簡潔的條件運算方式,可以用於代替 if-else 語句。在某些情況下,三元運算子可以使程式碼更加簡潔易讀。

以下是一些三元運算子的優點:

  • 簡潔:三元運算子可以用於一行程式碼中表達條件判斷和結果輸出。
  • 易讀:三元運算子的語法比較直觀,易於理解。

以下是一些三元運算子的缺點:

  • 可讀性:對於較為複雜的條件判斷,三元運算子可能會使程式碼難以閱讀。
  • 嵌套:三元運算子可以嵌套使用,但過度嵌套可能會使程式碼難以理解。

總體而言,三元運算子是一種有用的工具,可以用於簡化程式碼。但是,在使用三元運算子時,需要考慮程式碼的可讀性和易維護性。

延伸閱讀-三元運算子教學

範例

以下是一些範例輸入和輸出:

輸入:abba
輸出:yes

輸入:abcba
輸出:yes

輸入:abc
輸出:no

結論

該程式碼使用簡單的邏輯和 C++ 標準函式庫中的函式來有效地判斷一個字串是否為迴文。

法二 迴圈法

#include <iostream>
#include <string>

using namespace std;

bool isPalindrome(string str) {
  int len = str.length();
  for (int i = 0; i < len / 2; i++) {
    if (str[i] != str[len - i - 1]) {
      return false;
    }
  }
  return true;
}

int main() {
  string str;
  getline(cin, str);

  if (isPalindrome(str)) {
    cout << "yes" << endl;
  } else {
    cout << "no" << endl;
  }

  return 0;
}

這段程式碼是用 C++ 編寫的,用於判斷一個字符串是否為迴文。

程式碼分析

  1. 包含頭文件

    C++

    #include <iostream>
    #include <string>
    

    這兩行程式碼包含了必要的頭文件 <iostream><string>

    • <iostream> 頭文件提供了標準輸入輸出流 cincout
    • <string> 頭文件提供了 string 類型,用於表示字符串。
  2. 定義函數

    C++

    bool isPalindrome(string str) {
      int len = str.length();
      for (int i = 0; i < len / 2; i++) {
        if (str[i] != str[len - i - 1]) {
          return false;
        }
      }
      return true;
    }
    

    這段程式碼定義了一個名為 isPalindrome 的函數,該函數接受一個字符串 str 作為參數,並返回一個布爾值,指示該字符串是否為迴文。

    • 函數的返回值類型為 bool,表示它將返回一個布爾值。
    • 函數的參數 strstring 類型,表示它將接受一個字符串作為參數。

    函數的具體實現如下:

    • 首先,獲取字符串 str 的長度,並將其存儲在變量 len 中。

    • 然後,使用一個

      for
      

      循環來比較字符串的每個字符及其對應的逆序字符。

      • 循環變量 i 從 0 開始,直到 i < len / 2

      • 在每個循環迭代中,將字符串的第

        i
        

        個字符與其逆序的第

        len - i - 1
        

        個字符進行比較。

        • 如果兩個字符相等,則繼續下一個循環迭代。
        • 如果兩個字符不相等,則字符串不是迴文,並返回 false
    • 如果循環結束,則字符串是迴文,並返回 true

  3. 主函數

    C++

    int main() {
      string str;
      getline(cin, str);
    
      if (isPalindrome(str)) {
        cout << "yes" << endl;
      } else {
        cout << "no" << endl;
      }
    
      return 0;
    }
    

    這段程式碼是程式碼的入口點,它包含了程式碼的邏輯。

    • 首先,定義一個 string 類型變量 str,用於存儲輸入的字符串。
    • 然後,使用 getline(cin, str) 函數從標準輸入獲取一個字符串並將其存儲在 str 變量中。
    • 接下來,調用 isPalindrome 函數來判斷字符串 str 是否為迴文,並將函數的返回值存儲在變量 result 中。
    • 最後,根據 result 的值輸出 “yes” 或 “no”。

程式碼總結

這段程式碼使用簡單的循環來比較字符串的每個字符及其對應的逆序字符,有效地判斷了一個字符串是否為迴文。程式碼結構清晰,易於理解和修改。