Leetcode——6. ZigZag Conversion

该博客介绍了LeetCode第6题的解决方案,即如何将字符串按照ZigZag模式进行转换。当给定行数时,代码会返回相应行数的ZigZag字符串。举例说明了当行数为3和4时,字符串"PAYPALISHIRING"的ZigZag转换结果,并阐述了解题思路,包括寻找下标之间的对应关系,以及确定不同方向元素的位置规律。
摘要由CSDN通过智能技术生成

题目原址

https://leetcode.com/problems/zigzag-conversion/description/

题目描述

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
A

nd 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 s, int numRows);

Example 1:

Input: s = “PAYPALISHIRING”, numRows = 3
Output: “PAHNAPLSIIGYIR”

Example 2:

Input: s = “PAYPALISHIRING”, numRows = 4
Output: “PINALSIGYAHRPI”

Explanation:

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

解题思路

这个题是给定一个字符串s,和行数numRows ,要求返回一个ZigZag的字符串,那么问题来了,什么是ZigZag? 就是这样的:

给定字符串S = 1234567890, numRows = 3, 那么对应的ZigZag为图一

这里写图片描述

将其一排一排输出,结果为152468037

如果numRows=4,那么对应的ZigZag为图二

这里写图片描述

思路:

这里其实是要找下标之间的对应关系,可以找到如下的规律:

  • 每一个V字形的都可以看成是一个组,一个完整的组的长度为size = 2 * line - 2
  • 对于垂直向下的一列元素来说,两组垂直向下的对应元素间隔大小为size,如上图一中元素1和元素5相隔3
  • 对于斜向上的元素来说,它的位置等于当前组的size - i,首先确定一组的长度为size,每个斜向上的元素都是对应同一行的垂直元素的,i表示元素所在的行。因为字符串可能被分为多个组,因此每一个组的第一个字符搜在的位置应该为j - i

AC代码

class Solution {
    public String convert(String s, int numRows) {
        StringBuilder sb = new StringBuilder();
        if(s == null || s.length() == 0 || numRows <= 0)
            return sb.toString();
        if(numRows == 1)
            return s;
        int size = 2 * numRows - 2;
        for(int i = 0; i < numRows; i++) {
            for(int j = i; j < s.length(); j += size) {
                sb.append(s.charAt(j));
                if(i != 0 && i != numRows - 1 && (j - i + size - i) < s.length()) {
                    sb.append(s.charAt(j + size - 2 * i));
                }
            }
        }
        return sb.toString();        
    }
}

参考

https://blog.csdn.net/chilseasai/article/details/47209565

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值