LeetCode-6 Z字形变换
> 题目:6. Z字形变换
> 难度:中等
> 分类:字符串
> 解决方案:字符串遍历
今天我们学习第6题Z字形变换,这是一个字符串的中等题,像这样字符串的题目经常作为面试题来考察面试者算法能力和写代码能力,因此最好能手写出该题。下面我们看看这道题的题目描述。
题目描述
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "LEETCODEISHIRING"
行数为3时,排列如下:
L C I RE T O E S I I GE D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如: "LCIRETOESIIGEDHN"
。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入: s = "LEETCODEISHIRING", numRows = 3输出: "LCIRETOESIIGEDHN"
示例 2:
输入: s = "LEETCODEISHIRING", numRows = 4输出: "LDREOEIIECIHNTSG"解释:
L D RE O E I IE C I H NT S G
分析
这个题目的难度不太大,主要是对题目的理解,只有理解题目中的Z字形是如何生成后才能做出来。注意,这里的Z字形其实是将Z逆时针旋转90°后形成的,如图1所示。
【图1.Z字形旋转过程 】
题目中的示例字符串不容易看出规律,我们假设一个字符串为 "ABCDEFGHIJKLMN"
,然后看看是如何形成Z字形的,具体过程如图2所示。
【图2.解题思路】
由图2可知黑色字符表示Z字形垂直部分,红色字符表示Z字形斜右方向部分。不难看出垂直部分字符的个数为 numRows
,斜右方向部分子数的个数为 numRows-2
(除首行和最后一行以外,其余的行数个数)。理解这个形成过程后,我们只需要把这个形成过用代码实现即可。
具体 java
代码如下所示:
class Solution { public String convert(String s, int numRows) { // 将字符串转换为字符数组 char[] arr = s.toCharArray(); // 构建二维数组(这里使用的StringBuilder是Java面试时的一个考点,可以查看String、StringBuffer和StringBuilder的区别) StringBuilder[] sb = new StringBuilder[numRows]; for(int i=0; i<numRows; i++){ sb[i] = new StringBuilder(); } int index = 0, len = arr.length; // 遍历原始数组,构建Z字形二维数组 while(index < len){ // 垂直添加元素 for(int i=0; i<numRows && index < len; i++){ sb[i].append(arr[index++]); }
// 斜右向添加元素 for(int i=numRows-2; i>=1 && index < len; i--){ sb[i].append(arr[index++]); } }
// 将除第0行以外的行有序拼接到第0行后面 for(int i=1; i<numRows; i++){ sb[0].append(sb[i]); }
return sb[0].toString(); }}
【图3.提交结果 】
Github地址
LeetCode-6 Z字形变换:https://github.com/JacobLei/leetcode/blob/master/src/main/java/A6_ZigZagConversion.java
参考链接
6.最长回文子串:https://leetcode.com/problems/zigzag-conversion/discuss/3403/Easy-to-understand-Java-solution
- 微信小程序开放 Wi-Fi、NFC 连接能力,未来可直接刷地铁?
- 2017奇葩机器人大盘点:Sophia想生孩子,Atlas后空翻,贝佐斯骑高达
- silverlight:分享一个不错的自定义布局CollectionFlow(可用于制作相册的哦!)
- 无法取得ConnectionSettings的问题
- DataTable,List去重复记录的方法
- Uploadify的一点总结
- 自动驾驶时代,中国移动要以怎样的姿势进入?
- JQuery中文日期控件
- Silverlight中的帧
- 窗口自动弹出浏览器显示广告的问题
- Instagram 开源用于 Python 3的MonkeyType 工具
- 拼凑了几个自定义的Panel(包括FishEyePanel,WrapPanel等几个常用的布局)
- jquery获取父级一级节点的序号
- Docker容器学习梳理--基础知识(2)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 丢弃掉那些 BeanUtils 工具类吧,MapStruct 是真香!!!
- 还在「黑盒炼丹」? 教你如何实现一行代码透视炼丹过程
- SpringCloud Alibaba微服务实战十九 - 集成RBAC授权
- 混合算法(GA+TS)求解作业车间调度问题(JSP)-禁忌搜索部分
- 打卡群刷题总结0810——从前序与中序遍历序列构造二叉树
- JavaScript性能优化
- Python+Excel+Word一秒制作百份合同
- SQL 订单揽收统计
- LeetCode11|搜索二维矩阵
- LeetCode14|合并排序的数组
- LeetCode12|两个数组的交集
- LeetCode10|只出现一次的数字II
- LeetCode15|有序数组中出现次数超过25%的元素
- 小米5(gemini:双子座)刷机
- Cygwin本地安装版