日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

不满足作对(JZ2 替换空格(Java))

發(fā)布時(shí)間:2023/12/20 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 不满足作对(JZ2 替换空格(Java)) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

菜雞程序猿第一次寫(xiě)博客
秋招結(jié)束后,處處不如意,為了更好的學(xué)習(xí)并記錄,遂開(kāi)始試著寫(xiě)寫(xiě)博客
第一篇博客,獻(xiàn)給劍指offer

關(guān)于劍指offer題2(空格替換)的一些自己的看法
題目描述:請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù),將一個(gè)字符串中的每個(gè)空格替換成“%20”。例如,當(dāng)字符串為We Are Happy.則經(jīng)過(guò)替換之后的字符串為We%20Are%20Happy。

因?yàn)楸救藢W(xué)的是Java,一看到題目,立馬想到String.replace()。
第一次提交的代碼:

public String replaceSpace(StringBuffer str) {return str.toString().replaceAll(" ", "%20");}

AC了,時(shí)間12ms,空間9800k

由于以前在LeetCode中做過(guò)題,感覺(jué)12ms時(shí)間好長(zhǎng)啊,想要優(yōu)化,心想自己實(shí)現(xiàn)會(huì)不會(huì)效果好點(diǎn),遂自己實(shí)現(xiàn)并提交
第二次提交的代碼:

public String replaceSpace2(StringBuffer str) {StringBuilder res = new StringBuilder();for(int i = 0; i < str.length(); i++) {char c = str.charAt(i);if(c!=' ') {res.append(c);}else {res.append("%20");}}return res.toString();}

啊哈~同樣AC了,但是時(shí)間13ms,空間9824k,時(shí)間空間全大了,what 回事?
本著刨(jia)根(zhuang)問(wèn)(xue)底(xi)的心態(tài),alt+鼠標(biāo)左鍵,源碼如下:

public String replaceAll(String regex, String replacement) {return Pattern.compile(regex).matcher(this).replaceAll(replacement);}

這。。。這是啥?繼續(xù)刨(jia)根(zhuang)問(wèn)(xue)底(xi)。。。目測(cè)是通過(guò)正則表達(dá)式來(lái)進(jìn)行替換的。。。。然后怎么個(gè)流程。。。。完全繞萌幣了。。。繞了半天找到了替換方法,此處不粘代碼了,發(fā)現(xiàn)和我代碼不同的地方主要是在charAt處,官方應(yīng)用的String對(duì)象,我用的是StringBuilder

是不是有什么關(guān)系?
因此第3次自己實(shí)現(xiàn),代碼如下:

public String replaceSpace3(StringBuffer str) {String s = str.toString();StringBuilder res = new StringBuilder();for(int i = 0; i < s.length(); i++) {char c = s.charAt(i);if(c != ' ') {res.append(c);}else {res.append("%20");}}return res.toString();}

提交,AC,時(shí)間12ms,空間9706k,雖然時(shí)間沒(méi)有優(yōu)化,但是空間略微少了點(diǎn)。

思考:執(zhí)行效率不是StringBuilder>StringBuffer>String 嗎?為啥這道題改成了String反而更快了呢?
分析:
1)通過(guò)對(duì)比,發(fā)現(xiàn)主要區(qū)別在charAt()方法上,StringBuffer在調(diào)用的是父類AbstractStringBuilder的方法,該方法在會(huì)先檢查下標(biāo)是否越界,然后在進(jìn)行返回


2)從線程安全方面看,StringBuffer是線程安全的,對(duì)應(yīng)方法會(huì)進(jìn)行加鎖,StringBuilder和String是非線程安全的,可能這也有關(guān)。

就這樣吧,也不知道分析的對(duì)不對(duì),也不會(huì)進(jìn)一步優(yōu)化!

菜雞程序猿就是我,我就是菜雞程序猿!

總結(jié)

以上是生活随笔為你收集整理的不满足作对(JZ2 替换空格(Java))的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。