LeetCode[6] - Z字形變換

題目

將字符串 "PAYPALISHIRING"以Z字形排列成給定的行數(shù):

P   A   H   N
A P L S I I G
Y   I   R

之后從左往右泉瞻,逐行讀取字符:"PAHNAPLSIIGYIR"

實(shí)現(xiàn)一個(gè)將字符串進(jìn)行指定行數(shù)變換的函數(shù):

string convert(string s, int numRows);
示例 1:

輸入: s = "PAYPALISHIRING", numRows = 3
輸出: "PAHNAPLSIIGYIR"
示例 2:

輸入: s = "PAYPALISHIRING", numRows = 4
輸出: "PINALSIGYAHRPI"
解釋:

P     I    N
A   L S  I G
Y A   H R
P     I

分析

這道題乍一看有點(diǎn)難杈绸,其實(shí)很簡(jiǎn)單撩幽,通過率也是高達(dá)30%柑潦,單純總結(jié)規(guī)律就能解答~~

  • 想法一:第一次的想法是每個(gè)V型為一組,然后根據(jù)組來計(jì)算每一行的個(gè)數(shù)進(jìn)而計(jì)算出每一行中每個(gè)字符的下標(biāo)夫凸。
    后來被我否定了秦叛,明明之中覺得復(fù)雜度偏高。
  • 想法二:直接一行一行來算數(shù)組下標(biāo)答恶。
    通過分析我們不難發(fā)現(xiàn)下標(biāo)規(guī)律:
  • 行數(shù)為四的時(shí)候:
    • 第一行:0 - 6 - 12 - 18 ... //步長(zhǎng)6 6 6
    • 第二行:1 - 5 - 7 - 11 - 13 ... //步長(zhǎng)4 2 4 2
    • 第三行:2 - 4 - 8 - 10 - 14 ... //步長(zhǎng)2 4 2 4
    • 第四行:3 - 9 - 15 - 21 ... //步長(zhǎng)6 6 6

規(guī)律顯而易見饺蚊,當(dāng)然讀者可以自己多試試其他的例子來驗(yàn)證。其實(shí)根據(jù)"Z"字的特點(diǎn)我們也能直接分析出這樣的規(guī)律悬嗓。接下來就是將規(guī)律函數(shù)化污呼。

  1. 步長(zhǎng):上述例子中 無論是6 還是4,2交替還是2包竹,4交替燕酷,都是和6相關(guān)的。那么6又是怎么和層數(shù)關(guān)聯(lián)呢周瞎?根據(jù)圖形"Z"來分析苗缩,每加1層就會(huì)增加2步長(zhǎng),那么步長(zhǎng)即為總層數(shù)*2-2声诸,后文稱之為絕對(duì)步長(zhǎng)酱讶。
  2. 根據(jù)步長(zhǎng)我們能很快計(jì)算第一層的所有下標(biāo)。那第二層 第n層呢彼乌。第二層其實(shí)就是步長(zhǎng)-2泻肯,2交替渊迁,第三層是步長(zhǎng)步長(zhǎng)-4,4交替。
    提煉公式:步長(zhǎng)- 2*(層數(shù)-1),2*(層數(shù)-1)交替灶挟。
    當(dāng)然宫纬,最后一層和第一層步長(zhǎng)一直都是絕對(duì)步長(zhǎng)。
    接下來就是編碼
    public String convert(String s, int numRows) {
        char[] c = new char[s.length()];
        int size = numRows * 2 - 2; //絕對(duì)步長(zhǎng)
        int index; //記算s下標(biāo)
        int count = 0; //記錄c下標(biāo)
        int add; //相對(duì)步長(zhǎng)
        if (numRows < 2) {
            return s;
        }
        for (int i = 0; i < numRows; i++) { //一層一層遍歷
            index = i;
            add = i * 2;
            while (index < c.length) { //超出字符串長(zhǎng)度計(jì)算下一層
                c[count] = s.charAt(index);
                add = size - add;
                index += add == 0 ? size : add;
                count++;
            }
        }
        return new String(c);
    }

運(yùn)行很輕松就通過啦~~

比較

還是老規(guī)矩膏萧,拷貝速度排行第一的算法進(jìn)行比較

    public String convert1(String s, int numRows) {
        if(numRows < 2) {
            return s;
        }
        StringBuilder result = new StringBuilder();
        int group = 2 * numRows - 2;
        for(int i = 1; i <= numRows; i ++) {
            int interval = 2 * numRows - 2 * i;
            if(i == numRows) {
                interval = 2 * numRows - 2;
            }
            int index = i;
            while(index <= s.length()) {
                result.append(s.charAt(index - 1));
                index += interval;
                interval = group - interval;
                if(interval == 0) {
                    interval = group;
                }
            }
        }
        return result.toString();
    }

單純從代碼上看,感覺應(yīng)該不是算法王者的代碼蝌衔,很多優(yōu)化點(diǎn)榛泛,最明顯的就是StringBuilder構(gòu)造時(shí)候應(yīng)該傳入s長(zhǎng)度,不然默認(rèn)容量是16噩斟,然后字符串過長(zhǎng)的時(shí)候會(huì)不斷出發(fā)擴(kuò)容方法曹锨,調(diào)用多次Arrays.copy,上一篇的王者好像也是調(diào)用了多測(cè)Arrays.copy... 寫道這里我有點(diǎn)懷疑自己從前的認(rèn)知剃允。沛简。。從邏輯上看和我的邏輯有很多相似之處~~
好我們來跑一下代碼看一下時(shí)間差:
字符串為隨機(jī)字符串斥废。


測(cè)試1

測(cè)試2

嗯 果然leedcode測(cè)試用例不夠極端哈哈哈哈椒楣。然后我們稍微改進(jìn)一下王者的代碼。只修改StringBuilder容量那部分牡肉。


改進(jìn)

可見當(dāng)使用StringBuilder捧灰,Map等類的時(shí)候能確定容量盡量給明確容量~對(duì)性能還是有很大的提升的。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末统锤,一起剝皮案震驚了整個(gè)濱河市毛俏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饲窿,老刑警劉巖煌寇,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異逾雄,居然都是意外死亡阀溶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門嘲驾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淌哟,“玉大人,你說我怎么就攤上這事辽故⊥讲郑” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵誊垢,是天一觀的道長(zhǎng)掉弛。 經(jīng)常有香客問我症见,道長(zhǎng),這世上最難降的妖魔是什么殃饿? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任谋作,我火速辦了婚禮,結(jié)果婚禮上乎芳,老公的妹妹穿的比我還像新娘遵蚜。我一直安慰自己,他們只是感情好奈惑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布吭净。 她就那樣靜靜地躺著,像睡著了一般肴甸。 火紅的嫁衣襯著肌膚如雪寂殉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天原在,我揣著相機(jī)與錄音友扰,去河邊找鬼。 笑死庶柿,一個(gè)胖子當(dāng)著我的面吹牛村怪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播澳泵,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼实愚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了兔辅?” 一聲冷哼從身側(cè)響起腊敲,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎维苔,沒想到半個(gè)月后碰辅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡介时,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年没宾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沸柔。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡循衰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出褐澎,到底是詐尸還是另有隱情会钝,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站迁酸,受9級(jí)特大地震影響先鱼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奸鬓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一焙畔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧串远,春花似錦宏多、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至始苇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間筐喳,已是汗流浹背催式。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留避归,地道東北人荣月。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像梳毙,于是被迫代替她去往敵國(guó)和親哺窄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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

  • Z字形變換 將字符串"PAYPALISHIRING"以Z字形排列成給定的行數(shù): P A H N A ...
    不愛去冒險(xiǎn)的少年y閱讀 430評(píng)論 0 0
  • 一账锹、題目原型: 將字符串 "PAYPALISHIRING" 以Z字形排列成給定的行數(shù):輸入: s = "PAYPA...
    花果山松鼠閱讀 3,829評(píng)論 3 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理萌业,服務(wù)發(fā)現(xiàn),斷路器奸柬,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • 題目: 這個(gè)題我采用的是通過方向控制生年,來將字符串里的字符添加到構(gòu)建的list中,在循環(huán)中的碰到最后一行或者第一行進(jìn)...
    夏山聞汐閱讀 2,763評(píng)論 0 2
  • 自從去年參加了DISC雙證班-社群廓奕,給自己增加了很多的第一次抱婉。第一次在500人社群分享,第一次給陌生人解讀DI...
    莉言碎語(yǔ)閱讀 218評(píng)論 0 0