(六) ZigZag Convert

题目

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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

解答

ABCDEFGHIJKLMNOPQ 4 
A    H    N
B  G I  M O
C F  J L  P
D    K    Q

首先将字符按照Z字型排列起来,之后按照第一行到最后一行在组成串:AHNBGIMOCFJLPDKQ。我们可以看到第一行和最后一行的字母的下标是呈现出一个等差数列,根据关系观察很容易就可以发现这等差数列的差值是: 2 * numRows -2

实际上我们发现除了第一行和最后一行,其它行之中依旧存在等差数列,如在第二行中(B,I,O)同样其标也是呈现这样的等差关系,那么实际其实要解决这道题就只剩下最后一个问题了就是解决两个等差数中间的那个数的坐标(如BI之间G的坐标)。我们很容易就可以发现它的左边和其前一个数的间隔为 2 * rowRows-2-2 * row

C语言

char* convert(char* s, int numRows) {
  if(s  == NULL || numRows < 1)
    return s;
  int len = strlen(s);
  if(len == 0)
    return s;

  char *res = (char *)malloc(sizeof(char)*(len+1));
  res[len] = '\0';
    
  if(numRows == 1)
  {
      strcpy(res,s);
      return res;
  }

  int m = 0;
  int inter1 = 2 * numRows -2;
  for(int i = 0;i < numRows;i++){
    if(i == 0 || i== numRows-1){
        for(int j = i;j < len;j += inter1)
             res[m++] = s[j];
    }else{
        int inter2 = 2 * i;
        for(int j = i;j < len;j+=inter2){
            res[m++] = s[j];
            inter2 = inter1-inter2;
        }   
    }
  }
  return res;
}

Golang

func convert(s string, numRows int) string {                                                                                                                      
    if len(s) <= 1 || numRows == 1 { 
        return s
    }          
               
    res := make([]byte, len(s))
    inter1 := 2*numRows - 2 
    m := 0   
    for i := 0; i < numRows; i++ {
        inter2 := 2 * i 
        for j := i; j < len(s); j += inter2 {
            res[m] = s[j]
            m++
            if i == 0 || i == numRows-1 {
                inter2 = inter1
            } else {
                inter2 = inter1 - inter2
            }  
        }   
    }          
    return string(res)
}              

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容