力扣LeetCode算法题 第6题-Z 字形变换
创始人
2024-03-05 03:14:49

要求:

一开始看到题目,第一想到的思路,就被题目要求的思路给带偏了。

内容是Z字型输出内容

 就一直想着把字符串输出成上面这种格式

总是想着把字符串放入到二维数组中进行展示。

这样一来思路就受到了限制。

一直使用先写入数组中。

//将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。//比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:public static String convert1(String s, int numRows) {System.out.println("s.length="+s.length());//想法和思路。Z字格设计,其实就是把数字一个个放进到二维数组中。再按照顺序去读取出来。//二维 数组的长度length=s.length/(width-1),width=numRowsint arr_width = numRows;int arr_length = s.length()/(arr_width-1);int lie_mark=0;//向右进位标记int hang_mark=0;//向下进位标记//根据长度进行生成数组int[][] arrays = new int[arr_width][arr_length];//因为Z字写入数据,需要反向写入数据,涉及到了标记。int flag =-1;//flag==1,则从上往下写。  flag==-1,从下往上写。// i=0 ,1,2    i=3反向  i=5反向  i =9int flag_count =0;//记录结果int result=0;if(numRows==1){return s;}else {for (int i = 0; i < s.length(); i++) {hang_mark=flag_count;
//                System.out.println("i="+i);
//                System.out.println("lie_mark="+lie_mark);
//                System.out.println("hang_mark="+hang_mark);arrays[hang_mark][lie_mark]=s.charAt(i);if(flag_count==0  && flag_count==numRows-1){flag=-flag;//反向}//判断什么时候往下写if(flag==1){//向下输出flag_count++;}//判断什么时候向上斜写,(x+1)(y-1)if(flag==-1){//向上输出flag_count--;lie_mark++;}System.out.println("flag_count="+flag_count);}}//测试遍历二维数组for (int i = 0; i < arr_length; i++) {for (int j = 0; j < arr_width; j++) {System.out.print(" " +String.valueOf(arrays[i][j]));}System.out.println('\n');}return "";}

该功能还没写完,还存在测BUG.有待完善。

而在后续中,又想到一种办法,那就是不去一个个的写入。直接由果推导因。

我们的最终结果是字符串形式,那么我们就直接用字符串去进行拼接就行。

public static String convert(String s, int numRows) {//用于接收字符串组StringBuilder[] results = new StringBuilder[numRows];//String对象赋值for (int i = 0; i < numRows; i++) {results[i]=new StringBuilder();}//反向输出标志:int flag_count=0;//反向计数器。=0或者=numRows-1的时候说明到顶和底了,可以反向int flag = -1;// =1向下输出,=-1向上输出//判空if(numRows==1) return s;for(int i=0;i

下面是调试的字符串结果:

算法解释:

1.根据flag来进行判断向上输出还是向下输出

2.根据flag_count来判断顶底,到了顶底进行反向。

附上所有的代码:

package com.zhm.test;/*** @Author bige* @Date: 2022/11/28 10:37* @ApiNote:Z 字形变换*/
public class Leetcode_test006 {//将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。//比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:public static String convert1(String s, int numRows) {System.out.println("s.length="+s.length());//想法和思路。Z字格设计,其实就是把数字一个个放进到二维数组中。再按照顺序去读取出来。//二维 数组的长度length=s.length/(width-1),width=numRowsint arr_width = numRows;int arr_length = s.length()/(arr_width-1);int lie_mark=0;//向右进位标记int hang_mark=0;//向下进位标记//根据长度进行生成数组int[][] arrays = new int[arr_width][arr_length];//因为Z字写入数据,需要反向写入数据,涉及到了标记。int flag =-1;//flag==1,则从上往下写。  flag==-1,从下往上写。// i=0 ,1,2    i=3反向  i=5反向  i =9int flag_count =0;//记录结果int result=0;if(numRows==1){return s;}else {for (int i = 0; i < s.length(); i++) {hang_mark=flag_count;
//                System.out.println("i="+i);
//                System.out.println("lie_mark="+lie_mark);
//                System.out.println("hang_mark="+hang_mark);arrays[hang_mark][lie_mark]=s.charAt(i);if(flag_count==0  && flag_count==numRows-1){flag=-flag;//反向}//判断什么时候往下写if(flag==1){//向下输出flag_count++;}//判断什么时候向上斜写,(x+1)(y-1)if(flag==-1){//向上输出flag_count--;lie_mark++;}System.out.println("flag_count="+flag_count);}}//测试遍历二维数组for (int i = 0; i < arr_length; i++) {for (int j = 0; j < arr_width; j++) {System.out.print(" " +String.valueOf(arrays[i][j]));}System.out.println('\n');}return "";}//    例如对一个4行的
//
//        0     6      12        18
//        1   5 7   11 13    17
//        2 4   8 10   14 16
//        3     9      15
//
//    对于n行的, s中的第i个字符:lie=i%(numrows-1).
//    对余数进行判断
//    i%(2n-2) == 0 ----> row0
//    i%(2n-2) == 1 & 2n-2-1 ----> row1
//    i%(2n-2) == 2 & 2n-2-2 ----> row2
//    i%(2n-2) == 3
//    ...
//    i%(2n-2) == n-1 ----> row(n-1)
//    ==>
//    对 k = i%(2n-2)进行判断
//    k<=n-1时候,s[i]就属于第k行
//    k>n-1时候,s[i]就属于2n-2-k行
//            最后将rows拼接起来就行了public static String convert(String s, int numRows) {//用于接收字符串组StringBuilder[] results = new StringBuilder[numRows];//String对象赋值for (int i = 0; i < numRows; i++) {results[i]=new StringBuilder();}//反向输出标志:int flag_count=0;//反向计数器。=0或者=numRows-1的时候说明到顶和底了,可以反向int flag = -1;// =1向下输出,=-1向上输出//判空if(numRows==1) return s;for(int i=0;i

相关内容

热门资讯

demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...