博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 6. ZigZag Conversion
阅读量:5020 次
发布时间:2019-06-12

本文共 1951 字,大约阅读时间需要 6 分钟。

问题链接

题目解析

将一个字符串按之字形图案重新排列,返回新字符串。

解题思路

理解题意,什么叫之字形图案。举个例子,对于字符串"ABCDEFGHIJKLMN":

numRows = 1:如下,输出不变,为"ABCDEFGHIJKLMN";

ABCDEFGHIJKLMN

numRows = 2:如下,输出应为"ACEGIKMBDFHJLN";

A C E G I K M

B D F H J L N

numRows = 3:如下,输出应为"AEIMBDFHJLNCGK";

A - E - I - M

B D F H J L N
C - G - K - ?

numRows = 4:如下,输出应为"AGMBFHLNCEIKDJ";

A - - G - - M

B - F H - L N
C E - I K - ?
D - - J - - ?

大概就是这个样子,“一竖一提一竖一提...”(“|/”)结构,很明显这是一道找规律的题。假设“一竖一提”作为一组,如Row=4时,"A~F"、"G~L"为一组,可以发现每一组有(2*numRows-2)个元素。

本题中我们对输出结果按行进行一一赋值,对于“一竖”上的元素,相邻两组索引相差恰好为(2*numRows-2);对于“一提”上的元素,假设已知其左边相邻字母索引为x,那么可以求得其索引为:\(x-i + (2*numRows-2) - i\),其中 \(i\) 为函数,i ∈[0, numRows)。

注意“一提”与上下两行无关,以及随时检查时候超出原字符串总长度。

参考代码

class Solution {public:    string convert(string s, int numRows) {        if (numRows == 1) return s;        int Col = 2*numRows - 2;        string res = "";                for (int i = 0; i < numRows; i++) {            for (int j = i; j < s.size(); j+=Col) {                res += s[j];//“一竖”                int next = j-i + Col - i;                if (i != 0 && i != numRows-1 && next < s.size())//“一提”                    res += s[next];            }        }        return res;    }};

模拟解法

当然了,本题可以开一个二维数组进行模拟,参考链接:。

原理简单,从上到下,再从下到上,其实就是对“一竖”、“一提”赋值,最后再整合到一个字符串中。参考代码如下:

public String convert(String s, int nRows) {    char[] c = s.toCharArray();    int len = c.length;    StringBuffer[] sb = new StringBuffer[nRows];    for (int i = 0; i < sb.length; i++) sb[i] = new StringBuffer();        int i = 0;    while (i < len) {        for (int idx = 0; idx < nRows && i < len; idx++) // vertically down            sb[idx].append(c[i++]);        for (int idx = nRows-2; idx >= 1 && i < len; idx--) // obliquely up            sb[idx].append(c[i++]);    }    for (int idx = 1; idx < sb.length; idx++)        sb[0].append(sb[idx]);    return sb[0].toString();}

本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.


转载于:https://www.cnblogs.com/AlvinZH/p/8549899.html

你可能感兴趣的文章
收集的一些关于C++的黑魔法
查看>>
CTF中那些脑洞大开的编码和加密
查看>>
简化工作流程 10款必备的HTML5开发工具
查看>>
c++ 调用外部程序exe-ShellExecuteEx
查看>>
Java进击C#——语法之知识点的改进
查看>>
IdentityServer流程图与相关术语
查看>>
页面跳转
查看>>
art template前端模板引擎
查看>>
有标号的DAG计数 II
查看>>
Redis 配置
查看>>
JavaScript常见的五种数组去重的方式
查看>>
我的fgen放到sourceforge上了
查看>>
Nexus安装
查看>>
测试与调试
查看>>
textarea 为什么删除内容之后就不能再赋值了呢
查看>>
JS+CSS+HTML简单计算器
查看>>
It is the courage
查看>>
把一个英语句子中的单词次序颠倒后输出
查看>>
TCP/IP网络编程 读书笔记1
查看>>
html table 上下左右边框
查看>>