空格替換

一谎柄、題目

請(qǐng)編寫一個(gè)方法膏斤,輸入一個(gè)字符串彻舰,經(jīng)過一定的處理將字符串中的“空格”替換為“%20”并返回;

二诫咱、示例

輸入:

"hello world"

輸出:

"hello%20world"

三笙隙、解析

常規(guī)來說,這很簡單嘛坎缭,StringreplaceAll秒解:

private static String replaceBlankByString(String string) {
    return string.replaceAll("\\s", "%20");
}

這是依賴于String的正則替換竟痰,那么換個(gè)思路,自己實(shí)現(xiàn)幻锁;

新建一個(gè)單獨(dú)的list凯亮,作為替換后的字符數(shù)組集合(自動(dòng)擴(kuò)容),然后遍歷轉(zhuǎn)換后的字符數(shù)組哄尔,遇到“空格”字符即替換假消,代碼如下:

private static String replaceBlankByList(String string) {
    char[] arr = string.toCharArray();
    // 注意泛型不能是基本類型
    List<Character> list = new ArrayList<>();
    for (char anArr : arr) {
        if (anArr == ' ') {
            list.add('%');
            list.add('2');
            list.add('0');
        } else {
            list.add(anArr);
        }
    }
    StringBuilder builder = new StringBuilder();
    for (Character c : list) {
        builder.append(c);
    }
    return builder.toString();
}

可能很多人到這就已經(jīng)很滿意了,包括我自己也是岭接,但是網(wǎng)上卻有更優(yōu)解富拗,首先計(jì)算“空格”字符數(shù)量,得到最終生成的字符數(shù)組大小鸣戴,設(shè)置兩個(gè)指針啃沪,p1、p2窄锅,p1固定在原來字符串的尾部创千,p2固定在目前字符串的尾部,p1往前移動(dòng)入偷,移動(dòng)一格追驴,p2復(fù)制一個(gè)字符并也往前移動(dòng)一格,知道遇到“空格”字符疏之,p1往前移動(dòng)一格殿雪,p2往前移動(dòng)三格,并分別寫入'0'锋爪、‘2’丙曙、'%'三格字符,結(jié)束條件為p1 其骄、p2相遇亏镰;

可能文字不太有畫面感,截取劍指Offer面試題:3.替換空格中的圖片拯爽,更加清楚地闡述了這一過程拆挥;

示例圖

我采用Java代碼演示這一過程:

private static String replaceBlankByArray(String string) {
    char[] arr = string.toCharArray();
    int length = arr.length;
    int blankCount = 0;
    int newLength = 0;
    for (Character c : arr) {
        // 計(jì)算空格數(shù)量
        if (c == ' ') {
            blankCount++;
        }
    }
    newLength = length + 2 * blankCount;
    char[] newArr = new char[newLength];
    System.arraycopy(arr, 0, newArr, 0, length);

    for (int i = length - 1, j = newLength - 1; i != j; i--, j--) {
        if (newArr[i] == ' ') {
            newArr[j--] = '0';
            newArr[j--] = '2';
            newArr[j] = '%';
        } else {
            newArr[j] = newArr[i];
        }
    }
    return String.valueOf(newArr);
}

看起來的確代碼最為復(fù)雜,但是細(xì)想想,這種方法只用一次遍歷纸兔,不用經(jīng)歷上面ArrayList的擴(kuò)容計(jì)算,因此效率應(yīng)該最高否副,采用replaceAll基于Java原生api汉矿,效率有待考證。

三备禀、效率

空口無憑洲拇,寫個(gè)小demo一試便知:

public static void main(String[] args) {
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < 10000; i++) {
        builder.append("A B ");
    }

    long s = System.currentTimeMillis();
    replaceBlankByString(builder.toString());
    System.out.println("replaceAll cost:" + (System.currentTimeMillis() - s));
    s = System.currentTimeMillis();
    replaceBlankByList(builder.toString());
    System.out.println("list cost:" + (System.currentTimeMillis() - s));
    s = System.currentTimeMillis();
    replaceBlankByArray(builder.toString());
    System.out.println("array cost:" + (System.currentTimeMillis() - s));
}

先定個(gè)10,000個(gè)循環(huán)生成測(cè)試數(shù)據(jù),觀察輸出:

replaceAll cost: 158
list cost: 89
array cost: 7

增加至100,000曲尸;

replaceAll cost: 164
list cost: 90
array cost: 16

增加至1000,000赋续;

replaceAll cost: 324
list cost: 1223
array cost: 52

增加至10,000,000;

replaceAll cost: 3193
list cost: 46829
array cost: 505

通過數(shù)據(jù)對(duì)比很容易發(fā)現(xiàn):

  1. 通過定長數(shù)組指針移動(dòng)計(jì)算效率最高另患,且非常穩(wěn)定纽乱;
  2. StringreplaceAll在數(shù)據(jù)量較小效率不如其他,數(shù)據(jù)量較大表現(xiàn)較好昆箕;
  3. 采用list復(fù)制法數(shù)據(jù)量較小效率較好鸦列,數(shù)據(jù)量大了效率十分低下;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鹏倘,一起剝皮案震驚了整個(gè)濱河市薯嗤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纤泵,老刑警劉巖骆姐,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異捏题,居然都是意外死亡玻褪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門涉馅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來归园,“玉大人,你說我怎么就攤上這事稚矿∮褂眨” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵晤揣,是天一觀的道長桥爽。 經(jīng)常有香客問我,道長昧识,這世上最難降的妖魔是什么钠四? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上缀去,老公的妹妹穿的比我還像新娘侣灶。我一直安慰自己,他們只是感情好缕碎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布褥影。 她就那樣靜靜地躺著,像睡著了一般咏雌。 火紅的嫁衣襯著肌膚如雪凡怎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天赊抖,我揣著相機(jī)與錄音统倒,去河邊找鬼。 笑死氛雪,一個(gè)胖子當(dāng)著我的面吹牛房匆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播注暗,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼坛缕,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了捆昏?” 一聲冷哼從身側(cè)響起赚楚,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎骗卜,沒想到半個(gè)月后宠页,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寇仓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年举户,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遍烦。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡俭嘁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出服猪,到底是詐尸還是另有隱情供填,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布罢猪,位于F島的核電站近她,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏膳帕。R本人自食惡果不足惜粘捎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧攒磨,春花似錦泳桦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至漆羔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狱掂,已是汗流浹背演痒。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留趋惨,地道東北人鸟顺。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像器虾,于是被迫代替她去往敵國和親讯嫂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容