(六) ZigZag Convert

L白水飘萍 · · 969 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

题目

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


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:L白水飘萍

查看原文:(六) ZigZag Convert

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

969 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传