题目描述

原题链接

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:

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

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:”PAHNAPLSIIGYIR”。

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

个人解法

JavaScript

  1. var convert = function (s, numRows) {
  2. const arr = [];
  3. if(numRows === 1){
  4. return s;
  5. }
  6. for (let i = 0; i < numRows; i++) {
  7. arr.push([]);
  8. }
  9. const length = s.length;
  10. let up = false;
  11. let index = 0;
  12. let arrIndex = 0;
  13. while (index < length) {
  14. arr[arrIndex].push(s[index]);
  15. if (up) {
  16. arrIndex--;
  17. } else {
  18. arrIndex++;
  19. }
  20. if (arrIndex === 0) {
  21. up = false;
  22. } else if (arrIndex === numRows - 1) {
  23. up = true;
  24. }
  25. index++;
  26. }
  27. let result = '';
  28. for (let i = 0; i < numRows; i++) {
  29. result += arr[i].join('');
  30. }
  31. return result;
  32. };

Java

更优解法

JavaScript

  1. /**
  2. * @param {string} s
  3. * @param {number} numRows
  4. * @return {string}
  5. */
  6. var convert = function(s, numRows) {
  7. if(numRows == 1)
  8. return s;
  9. const len = Math.min(s.length, numRows);
  10. const rows = [];
  11. for(let i = 0; i< len; i++) rows[i] = "";
  12. let loc = 0;
  13. let down = false;
  14. for(const c of s) {
  15. rows[loc] += c;
  16. if(loc == 0 || loc == numRows - 1)
  17. down = !down;
  18. loc += down ? 1 : -1;
  19. }
  20. let ans = "";
  21. for(const row of rows) {
  22. ans += row;
  23. }
  24. return ans;
  25. };

Java