zigzag 經典面試題

題目描述:

The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

P A H NA P L S I I GY I R

And then read line by line: "PAHNAPLSIIGYIR"

Write the code that will take a string and make this conversion given a number of rows:

string convert(string text, int nRows);

convert("PAYPALISHIRING", 3) should return "PAHNAPLSIIGYIR".

這道題目的具體意思就是,給了一個string這個string的寫法十分怪異,具體的表現就是我們的字元串是從上到下寫,然後在第二列放下一個字母,然後以此類推,從上面的例子中可以看出來。

題目思路:

那麼現在題目的思路也就很清晰了,首先我們把手裡的字元串轉換成題目描述的例子字元串的樣子,具體的做法就是使用n個stringbuffer(n是題目中的要求一個參數),然後分兩個for loop分別從上和從下面開始去掃這三個stringbuffer,每次掃的時候就要把手裡的字元串給賦值進去,到了邊界之後再去第二列的賦值。以此類推,最後將三個是 tiring buffer合併起來從上到下的一個個將裡面的字元讀取出來。

Java代碼:

public String convert(String s, int nRows) { char[] c = s.toCharArray(); int len = c.length; StringBuffer[] sb = new StringBuffer[nRows]; //創建一個頭sb(例子中的) for (int i = 0; i < sb.length; i++) sb[i] = new StringBuffer();//頭sb下面再掛上三個sb 想像一下掛窗帘 int i = 0; while (i < len) { for (int idx = 0; idx < nRows && i < len; idx++) // vertically down sb[idx].append(c[i++]); //第一列向下 for (int idx = nRows-2; idx >= 1 && i < len; idx--) // obliquely up sb[idx].append(c[i++]);//第二列中間放一個 } for (int idx = 1; idx < sb.length; idx++) sb[0].append(sb[idx]);//最後將三個sb中的char合併起來 return sb[0].toString();}

Time complexity:

O(N)

推薦閱讀:

清單|美帝常用轉賬App
在美帝被警察Pull Over了怎麼辦?有些行為千萬不要嘗試!

TAG:面試 | 美國生活 | 計算機科學 |