面試題【002字元串替換空格】精妙解法

来源:https://www.cnblogs.com/zhao123/archive/2019/07/04/11132036.html
-Advertisement-
Play Games

題目描述 請實現一個函數,將一個字元串中的每個空格替換成“%20”。例如,當字元串為We Are Happy.則經過替換之後的字元串為We%20Are%20Happy。 解題思路 老實說,看到這個題目想到的就是字元串替換,但是面試題肯定不是這麼簡單的,那麼怎麼在原字元串上進行高效的替換呢?我們的字元 ...


題目描述

請實現一個函數,將一個字元串中的每個空格替換成“%20”。例如,當字元串為We Are Happy.則經過替換之後的字元串為We%20Are%20Happy。

解題思路

老實說,看到這個題目想到的就是字元串替換,但是面試題肯定不是這麼簡單的,那麼怎麼在原字元串上進行高效的替換呢?我們的字元串替換,主要的消耗是在移位上,每遇到一個空格,後面的字元串就往後移位,那麼之前的移位都沒有作用了。我們知道字元串的長度,知道替換字元串的長度,如果還知道空格的多少,那麼這個字元串的長度就知道了。知道長度之後,只需要把數據放到響應的位置就可以了。
步驟:
1. 遍歷字元串,統計出空格數量
2. 再遍歷一次,完成替換

代碼實現

普通解法,直接替換字元串

public static string ReplaceSpaceForSimple(string str)
{
    return str.Replace(" ", "%20");
}

精妙解法數據移位

public static string ReplaceSpace(string str)
{
    int count = 0;
    foreach (var item in str)
    {
        if (item == ' ')
        {
            count++;
        }
    }

    int oLength = str.Length;
    int length = oLength + count * 2; //"%20".Length-1
    char[] tempArray = new char[length]; //新開闢了一個空間
    length--;
    for (int i = oLength - 1; i >= 0; i--)
    {
        if (str[i] == ' ')
        {
            tempArray[length--] = '0';
            tempArray[length--] = '2';
            tempArray[length--] = '%';
        }
        else
        {
            tempArray[length--] = str[i];
        }
    }

    return new string(tempArray);
}

賦值給另外一個

public static string ReplaceForBS(string str) {
    StringBuilder sb = new StringBuilder();
    foreach (var item in str) {
        if (item == ' ')
        {
            sb.Append("%20");
        }
        else {
            sb.Append(item);
        }
    }
    return sb.ToString();
}

測試

中間空格

[Fact]
public void Middle()
{
    string str = "We Are Happy.";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}
View Code

開始空格

[Fact]
public void Start()
{
    string str = " We Are Happy.";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}
View Code

結束空格

[Fact]
public void End()
{
    string str = "We Are Happy. ";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}

多空格

[Fact]
public void More()
{
    string str = "We     Are  Happy.";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}

空字元串

[Fact]
public void Empty()
{
    string str = "";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));

    str = " ";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));

    str = "  ";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}
View Code

結果

想入非非:擴展思維,發揮想象

1. 這個題可以擴展為替換其他的數據,不要局限於單一的替換,URL就是ASCII替換
2. 字元串是一種特殊的char[]

3. 熟悉字元串string,stringbuilder


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 該篇內容由個人博客 "點擊跳轉" 同步更新!轉載請註明出處! .NetCore徹底詮釋了“萬物皆可註入”這句話的含義,在.NetCore中到處可見註入的使用。因此core中也提供了三種註入方式的使用,分別是: 1. AddTransient:每次請求,都獲取一個新的實例。即使同一個請求獲取多次也會是 ...
  • 在實際開發過程中,很多時候會拷貝一個現有的資料庫連接字元串,修改對應的資料庫名、用戶名、密碼等配置成新的資料庫連接字元串。但是有時候我們需要增加一些額外的配置,比如超時時間,最大連接池等,此時我們可以查找資料,其實可以使用Ado.Net 的SqlConnectionStringBuilder來構造數 ...
  • 跟同事合作前後端分離項目,自己對 WebApi 的很多知識不夠全,雖說不必要學全棧,可是也要瞭解基礎知識,才能合理設計介面、API,方便與前端交接。 晚上回到宿舍後,對 WebApi 的知識查漏補缺,主要補充了 WebAPi 的一些方法、特性等如何與前端契合,如何利用工具測試 API 、Axios ...
  • 在項目中總會用到son解析,比如RabbitMQ中使用json串解析,比如發過來的實體對象有50個欄位,而實際只需要用到裡面的幾個欄位,這時我們創建實體時,只需要創建需要的幾個欄位即可。 測試實例,首先定義實體 實體解析測試,可以創建解析實體,也可以不創建實體對象,直接使用匿名類解析 ...
  • 題目描述 輸入一個鏈表,按鏈表值從尾到頭的順序返回一個List。 解題思路 輸入一個鏈表,從尾到頭輸出,正常的遍歷都是從頭到尾輸出,而這裡需要從尾到頭輸出,那麼就是“先進後出”,也就是棧的功能。 代碼實現 棧的方式實現 遞歸的方式實現 想入非非:擴展思維,發揮想象 1.輸入一個鏈表,返回一個倒過來的 ...
  • 在談起java一家獨大的時候,dotnet人員總是一邊嘲笑大量濫竽充數的java從業者,一邊羡慕人家的生態。以前是只能羡慕,現在dotnet core開源了,我們都可以為dotnet core的開原生態貢獻自己的微薄之力。 WTM框架,一個基於 asp.net core 和 EF core的快速開發 ...
  • install-package PdfSharp -v 1.51.5185-beta ...
  • 在日常開發過程中,難免有這樣一種需求:就是你所建的每一個類文件或者介面文件都需要標註下作者姓名以及類的用途。如果我們每次創建文件的時候都需要寫一遍這些信息是很煩神的。還好Visual Studio給我們提供了模板註釋的功能來自動幫我們生成類似的註釋代碼。今天趁著中午休息的時間就讓我們一起來操作下吧。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...