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

新加坡程式設計師面試題:C++ 字串類別設計與運算子多載實作

     編輯:關於C++

題目背景

這是一道經典的新加坡程式設計師面試題,要求設計一個繼承自 C++ 標準 std::string 的 String 類別,並新增兩個成員函數:模式識別與記號提取。題目不僅考驗 C++ 繼承與運算子多載,還涉及字串處理的邏輯思維。

問題描述

1. 模式識別函數(運算子 / 多載)

實作 operator/,傳入一個子字串,回傳該子字串在母字串中出現的次數。若子字串為空,回傳 0。

2. 記號提取函數

實作 get_token(),依序回傳字串中由空白分隔的子字串。例如 " aaa bbb cc " 依序回傳 "aaa"、"bbb"、"cc"。第四次呼叫回傳空字串,第五次重新從第一個記號開始。選擇性支援自訂分隔字元集合。

演算法分析與程式碼實作

運算子 / 多載

int CMyString::operator/ (const String& sub)
{
    if(sub.IsEmpty())
        return 0;
    int count = 0;
    int ret = Find(sub);
    if(ret == -1)
        return 0;
    else if(ret <= GetLength())
    {
        do
        {
            count++;
            ret = Find(sub, GetAt(ret));
        } while(ret != -1);
    }
    return count;
}

核心邏輯:使用 Find 尋找子字串位置,找到後累加計數,並從下一字元繼續搜尋,直到無匹配為止。

get_token 實作

CString CMyString::get_token()
{
    static int callednum = 0;
    int totalnum = operator/(' ');
    if(totalnum == 0)
        return NULL;
    int tokennum, ret1 = 0, ret2 = 0;
    while((ret1 = Find(' ', ret2)) != -1 && (ret2 = Find(' ', ret1)) != -1)
    {
        if(ret1 == ret2 - 1)
            totalnum--; // 相鄰空白視為一個
        return Mid(ret1, ret2 - ret1);
    }
    if(ret2 == -1)
        return Right(GetLength() - ret1);
    tokennum = totalnum;
    (callednum++) %= tokennum;
}

關鍵點:

  • 靜態變數 callednum 記錄呼叫次數,實現循環回傳。
  • 利用 operator/ 計算空白總數,推算記號數量。
  • 處理連續空白、字串尾部等邊界情況。

擴充建議

可進一步支援自訂分隔字元集合,將分隔字元作為參數傳入 get_token,提升靈活性。此外,若使用標準庫 std::string,可結合 find_first_of、substr 等簡化實作。

總結

此題考察類別設計、運算子多載、靜態變數應用與字串剖析邏輯。實作時需注意邊界條件(空字串、連續分隔字元、循環邏輯),代碼雖為粗略演算法,但展示核心思路,適合 MFC 初學者參考。

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