[LeetCode题解] ZigZag Conversion

news/2024/6/27 6:55:24 标签: 数据结构与算法

原文在这,可以来我blog翻翻哦。

第二天。今天AC掉了一道之前没AC掉的题目。。。

今天的题目是6. ZigZag Conversion

题目描述:

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

And 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"
Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:

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

恩,又是一道“编程题“, 并不涉及到什么算法,静下心来仔细想想还是能做出来的。做这道题的思路就是一点一点跑例子,找出其中的规律就好了。

我们先以输入为s = "PAYPALISHIRING", numRows = 3为例子,这是题目给出的例子,正确答案已经有了。

先把Z字型画出来(不难发现,题目在最开始其实已经给出了答案):

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

观察上面的例子我们可以发现:

  • 第一行中的元素在原来的字符串中下标相差4个。
  • 第二行中的元素在原来字符串中下标相差2个。

ok,看起来好像找到了一些规律,继续跑一个例子验证一下,这次的输入是s = "PAYPALISHIRING", numRows = 3,把Z字型画出来:

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

可以看到第一行的元素在原来字符串中的下标相差6个,但是第二行却出现了一些不一样的情况:

  • AL相差4个,LS却相差2个
  • SI相差4个,IG却相差2个

看起来offset是有规律的,而且好像需要分成两种情况,继续看看第3行:

  • YA相差2个,AH相差4个
  • HR相差4个,如果还有元素的话,下一个元素与R之间显然相差2个。

从上面的例子来看显然是要分成两种情况的,某一行中下标之间的offset是不断在两个数字间不断变换的。

我们尝试用两个数组来保存这些offset,我们把这两个数组定义为skipDownskipUp。其中skipDown表示下标在z字型中经过了一个向下的剪头,如第二个例子中,第一行的P移动到I时,P经过了AYPAl组成的向下的剪头。skipUp同理可推。

如果我们继续跑例子的话,应该是比较容易找出规律的:

  • i行的skipDown2*(i-1),而第一行和最后一行的skipDown都应该为2*(numRows)
  • skipDownskipUp是逆序的关系。

综上,我们可以写出下面的代码:

string convert(string s, int numRows) {
    if (numRows < 2) return s;
    vector<int> skipDown(numRows);
    vector<int> skipUp(numRows);
    
    skipDown[0] = 2*(numRows-1);
    skipUp[0] = 0;
    for(int i = 1;i < numRows; i++) {
        skipDown[i] = skipDown[i-1] - 2;
        skipUp[i] = skipUp[i-1] + 2;
    }
    
    skipDown[numRows-1] = skipDown[0];
    skipUp[0] = skipUp[numRows-1];
    
    string res(s.size(), ' ');
    
    int index = 0;
    for(int i = 0;i < numRows; i++) {
        bool flag = true;
        for(int j = i;j < s.size();index++) {
            res[index] = s[j];

            if (flag) { j += skipDown[i]; }
            else { j += skipUp[i]; }
            
            flag = !flag;
        }
    }
    return res;
}

当然这肯定不是最优的代码,比如其实我们可以不用两个数组,甚至不用数组来保存的offset,但是这样写会比较容易理解,代码会比较简单点。


http://www.niftyadmin.cn/n/1583414.html

相关文章

Flink 1.7 文档翻译活动期待大家的参与 | ApacheCN

参与方式&#xff1a;https://github.com/apachecn/f... 整体进度&#xff1a;https://github.com/apachecn/f... 项目仓库&#xff1a;https://github.com/apachecn/f... 贡献指南 请您勇敢地去翻译和改进翻译。虽然我们追求卓越&#xff0c;但我们并不要求您做到十全十美&…

小a的轰炸游戏 (差分)

我是看题解的&#xff01; 这道题还是有很多细节&#xff0c;当然&#xff0c;是一道差分的好题&#xff01; 题意&#xff1a;有2种飞机&#xff0c;一种是只炸上半菱形&#xff0c;一种是炸整个菱形。问所有区域内的所有格子的异或和。 思路&#xff1a;用前缀和思路&#xf…

每个 JavaScript 工程师都应懂的33个概念

简介 这个项目是为了帮助开发者掌握 JavaScript 概念而创立的。它不是必备&#xff0c;但在未来学习&#xff08;JavaScript&#xff09;中&#xff0c;可以作为一篇指南。 本篇文章是参照 leonardomso 创立&#xff0c;英文版项目地址在这里。 由于原版资源都要翻墙&#xff0…

小森动画回忆录(二)-同步奥特曼属性到程序

上篇说到了如何设计了数据 采用了啥方式 先干了再解释 同步奥特曼属性到程序-源码实现 //从文件加载迪迦奥特曼属性数据到程序中 void LoadUltramanMainAttribute(vector<DejaAltmanAttribute>& dejaAltmanAttribute){//打开迪迦奥特曼属性.txt文件读取 ifstre…

使用nginx+uwsgi部署Django项目

一&#xff1a;安装nginx1&#xff1a;安装编译工具及库文件yum -y install make zlib zlib-devel gcc-c libtool openssl openssl-devel2&#xff1a;安装PCREwget https://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz tar zxvf pcre-8.35.tar.gz cd…

.NET(C#)有哪些主流的ORM框架,FreeSql,SqlSugar,Dapper,EF还是...

前言 在以前的一篇文章中&#xff0c;为大家分享了《什么是ORM&#xff1f;为什么用ORM&#xff1f;浅析ORM的使用及利弊》。那么&#xff0c;在目前的.NET(C#)的世界里&#xff0c;有哪些主流的ORM&#xff0c;FreeSql&#xff0c;SqlSugar&#xff0c;Dapper&#xff0c;Enti…

Django作为接口时跨域问题解决

一&#xff1a;安装django-cors-headerspip install django-cors-headers二&#xff1a;配置settings.py# Application definition INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib.sessions,django.contrib.messages,…

2019年,你需要关注这些Node API和Web框架

对于Node.js框架和开源软件来说&#xff0c;2018年是非常有趣的一年。开发者社区讨论了企业赞助对开源项目的作用以及如何维护那些没有经济支持却有数百万人使用的项目。同样&#xff0c;安全问题也得到了极大关注&#xff0c;一些流行的Node/JS软件包被劫持&#xff0c;Github…