leetcode算法练习【6】 Z 字形变换

题目如下

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

比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:

L   C   I   R
E T O E S I I G
E   D   H   N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。

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

string convert(string s, int numRows);
示例 1:

输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"
示例 2:

输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:

L     D     R
E   O E   I I
E C   I H   N
T     S     G


方案:直接计算Z型变化后的距离

  • 分两种
    • 1、上下边;每一部分有一块
    • 2、中间;每一部分有两块
class Solution {
        public String convert(String s, int numRows) {
            if (s.length()<=numRows||numRows==1){
                return s;
            }
            char[] arr = s.toCharArray( );
            char[] ans = new char[s.length( )];
            int ans_index = 0;
            int index = 0;
            int distance = numRows * 2 - 2;
            for (int i = 0; i < numRows; i++) {
                //这个是第一行和最后一行的规则
                if ((i == 0 || i == numRows - 1)) {
                    while (index * distance + i < s.length( )) {
                        ans[ans_index] = arr[index * distance + i];
                        ans_index++;
                        index++;
                    }
                } else if (i > 0 && i < numRows - 1) {
                    //俩货的距离,有两种情况
                    int dis1 = 2 * (numRows - i - 1);
                    while ((index * distance + i < s.length( ))){
                        ans[ans_index] = arr[index * distance + i];
                        ans_index++;
                        if (index * distance + i + dis1 < s.length( )) {
                            ans[ans_index] = arr[index * distance + i + dis1];
                            ans_index++;
                        }
                        index++;
                    }
                }
                index = 0;
            }
            return String.valueOf(ans);
        }
    }
复杂度计算
  • 时间复杂度:O(n)
  • 空间复杂度:O(n),由于复制了分数组,否则应当是O(1)

基础知识点:String与char[]的相互转换

//1.String类的toCharArray()方法,将字符串转为字符(char)数组
String ss=“abc”;
char[] cc;
cc=ss.toCharArray();

//2.String类的valueOf()方法,将字符(char)数组转换为字符串
char[] cc={‘a’,‘b’,‘c’};
ss=String.valueOf(cc);


所有源码:github-leetcode

发布了120 篇原创文章 · 获赞 153 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/symuamua/article/details/105313079