这道题之前一直不会做,明白他是什么意思,但是找不到方法或者方法过于繁琐
方法1:
这是我在力扣评论区看到的方法,太精彩了。
虽然我实现起来效率并不高,可能是我代码的问题,但是他的思路很巧妙。
字符串的规律是假如numRows是4
那1234321234321……
将数字一样的拿出来拼接,最终拼在一起
这是我根据这个思路写的代码,有点丑陋
class Solution {public String convert(String s, int numRows) {if(numRows < 2) return s;List<StringBuilder>list=new ArrayList<>(numRows);char[] array = s.toCharArray();for (int i = 0; i < numRows; i++) {list.add(new StringBuilder());}int flag=-1;//1是向下 -1是向上int index=0;for (int i = 0; i < array.length; i++) {char c = array[i];StringBuilder sb = list.get(index);sb.append(c);if(index==0||index==numRows-1){//因为index是从0开始的,所以到了numRow-1,不从1开始的原因是list的索引也是从0开始的flag=-flag;}index+=flag;}StringBuilder result=new StringBuilder();for (StringBuilder stringBuilder : list) {result.append(stringBuilder.toString());}return result.toString();}
}
方法2:
这个是官方题解,结合他的图也很好理解。特别是他的flag设计得太妙了。
直接使用index+-flag,免去了一次判断
class Solution {public String convert(String s, int numRows) {if(numRows < 2) return s;List<StringBuilder>list=new ArrayList<>(numRows);char[] array = s.toCharArray();for (int i = 0; i < numRows; i++) {list.add(new StringBuilder());}int flag=-1;//1是向下 -1是向上int index=0;for (int i = 0; i < array.length; i++) {char c = array[i];StringBuilder sb = list.get(index);sb.append(c);if(index==0||index==numRows-1){//因为index是从0开始的,所以到了numRow-1,不从1开始的原因是list的索引也是从0开始的flag=-flag;}index+=flag;}StringBuilder result=new StringBuilder();for (StringBuilder stringBuilder : list) {result.append(stringBuilder.toString());}return result.toString();}
}