博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode题解] ZigZag Conversion
阅读量:5832 次
发布时间:2019-06-18

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

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

今天的题目是

题目描述:

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   NA P L S I I GY   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 = 3Output: "PAHNAPLSIIGYIR"
Input: s = "PAYPALISHIRING", numRows = 4Output: "PINALSIGYAHRPI"Explanation:P     I    NA   L S  I GY A   H RP     I

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

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

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

P   A   H   NA P L S I I GY   I   R

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

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

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

P     I    NA   L S  I GY A   H RP     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
skipDown(numRows); vector
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://cjrdx.baihongyu.com/

你可能感兴趣的文章
微软通过Bletchley在Azure上打造区块链即服务
查看>>
树梅派安装docker-compose
查看>>
第56天:选中文字弹出提示框
查看>>
DDC系列 - UCP安装指南
查看>>
bash文件的详细解读
查看>>
SQL老司机,在SQL中计算 array & map & json数据
查看>>
布局VR的新动作,英特尔收购Movidius视觉芯片公司
查看>>
快速在Ubuntu安装PHP网站
查看>>
29 岁成为阿里巴巴 P8,工作前 5 年完成晋升 3 连跳,他如何做到?
查看>>
租来的电脑质量有保障吗?易点租:出厂故障率低于新电脑
查看>>
PostgreSQL Oracle 兼容性之 - 消息队列 DBMS_AQ
查看>>
虽然概念炒的火热,但是现实中的智能家居似乎是个“瘸子”
查看>>
Fescar 发布 0.2.3 版本,支持 Redis 和 Apollo
查看>>
JFinal-layui v1.2.1 发布,极速开发企业应用系统
查看>>
空中网受邀参加“电子竞技产业的绿色可持续发展之道”研讨会
查看>>
MIT研发团队开发出新系统,想要教会机器人真正理解人类说话
查看>>
开发自己的 chart - 每天5分钟玩转 Docker 容器技术(167)
查看>>
Logtail从入门到精通(四):正则表达式Java日志采集实战
查看>>
为重回美国市场,PSA将联合TravelCar推出汽车共享服务
查看>>
阿里ARouter路由实现Android模块化开发
查看>>