[Leetcode] 6. ZigZag Convertion 之字形转换字符串

Related Topics:[String]
Similar Questions

题目: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 N
A P L S I I G
Y 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".

思路:

这道题就是看坐标的变化。并且需要分块处理。

n=2时,字符串坐标变成zigzag的走法就是:

0 2 4 6

1 3 5 7

n=3时的走法是:

0 4 8

1 3 5 7 9

2 6 10

n=4时的走法是:

0 6 12

1 5 7 11 13

2 4 8 10 14

3 9 15

可以发现规律,每一个之的长度是 2n-2(n+n-2) (第二列第一行和最后一行少字)。

利用这个规律,可以按行填字。每一行中分为直线列元素和斜线列元素来处理。每一行中的直线列在原字符串中的索引均相差2n-2。而斜线上的元素的索引可由前一个直线列上的元素(即左方元素)的索引求得,即j+(2n-2)-2i(j和i分别为前一元素的列和行)。

在第一行和最后一行中,只存在直线列元素。其他行中两种元素交叉分布。

按照上面的规律就可以写出代码了。

java解法:

class Solution {
    public String convert(String s, int numRows) {
        if(numRows<=1) return s;
        int size=2*numRows-2;
        String res="";
        for(int i=0;i<numRows;i++) {
            for(int j=i;j<s.length();j+=size) {
                res+=s.charAt(j);
                int tmp=j+size-2*i;
                if(i!=0&&i!=numRows-1&&tmp<s.length()) res+=s.charAt(tmp);
            }
        }
        return res;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,358评论 0 33
  • 一、 1、请用Java写一个冒泡排序方法 【参考答案】 public static void Bubble(int...
    独云阅读 5,269评论 0 6
  • 这是我简书第一篇,也是我开始理想生活中的一步--纪录生活。上大学一年多我开始认识自己,了解自己。包括性格、喜好、择...
    柚子味阅读 1,576评论 0 1
  • 【暖暖】RIA便签练习打卡Day 1 R:拆书帮慢成长理念 第一、在一切跟学习有关的事情上反求诸己。在自己身上找原...
    暖暖going阅读 1,625评论 0 0
  • 3.冯神神啊 Dear喵喵: 嘿!独一无二的喵喵,有好多好多话想同你说。 咳,最近这些日子的状态,只有一个字,...
    冯神神啊阅读 1,702评论 0 2

友情链接更多精彩内容