力扣LeetCode算法题 第6题-Z 字形变换

news2024/11/26 22:24:56

要求:

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

内容是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=numRows
        int 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 =9
        int 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<s.length();i++){
            //按照结果意愿来进行存放
            results[flag_count].append(s.charAt(i));

            //判断顶底,进行反向输出
            if(flag_count==0 || flag_count==(numRows-1))
                flag=-flag;

            //计数器工作,每次循环计数一次
            if(flag==1)
                flag_count++;//=0向下输出
            else
                flag_count--;//=1向上输出
        }

        StringBuilder display = new StringBuilder();
        for (int i = 0; i < numRows; i++) {
            display.append(results[i].toString());
        }

        return display.toString();
    }

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

算法解释:

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=numRows
        int 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 =9
        int 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<s.length();i++){
            //按照结果意愿来进行存放
            results[flag_count].append(s.charAt(i));

            //判断顶底,进行反向输出
            if(flag_count==0 || flag_count==(numRows-1))
                flag=-flag;

            //计数器工作,每次循环计数一次
            if(flag==1)
                flag_count++;//=0向下输出
            else
                flag_count--;//=1向上输出
        }

        StringBuilder display = new StringBuilder();
        for (int i = 0; i < numRows; i++) {
            display.append(results[i].toString());
        }

        return display.toString();
    }
//        0     6      12        18
//        1   5 7   11 13    17
//        2 4   8 10   14 16
//        3     9      15
    public static void main(String[] args) {
        //String s = "0123456789876543210";
        String s = "PAYPALISHIRING";
        //convert(s,3);
        System.out.println("result = " + convert1(s,3));
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/50075.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

直播邀请函 | 第12届亚洲知识产权营商论坛:共建创新价值 开拓崭新领域

由香港特别行政区政府、香港贸易发展局及香港设计中心共同举办的亚洲知识产权营商论坛&#xff0c;每年为世界各地知识产权业界专家、商界领袖提供一个理想平台&#xff0c;共同探讨亚洲知识产权市场的最新发展&#xff0c;发掘更多商机。 去年&#xff0c;论坛共邀请70余位国…

使用HBuilder X开发Vue3+node+element-plus(一)

开发Vue3有很多的工具&#xff0c;比如VSCode&#xff0c;它也非常的好用&#xff0c;本文主要使用HBuilder X开发。 环境3个&#xff1a; Windows10 Node安装 1.打开官网&#xff0c;选择一个版本&#xff0c;进行安装 Node.js 2.选择路径&#xff0c;下一步就行了 3. 输…

【深度学习】torch.argmax()函数讲解 | pytorch

文章目录前言一、两个维度的张量使用torch.argmax()函数二、三个维度的张量使用torch.argmax()函数前言 这篇博客也是属于看了好久一直没写&#xff0c;终于写了。 一、两个维度的张量使用torch.argmax()函数 我们直接先举一个例子吧&#xff0c;我们随机生成一个2X3的张量&…

[附源码]SSM计算机毕业设计亿上汽车在线销售管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

11 Daemonset:忠实可靠的看门狗

文章目录1. 前言2. 为什么要有 DaemonSet(看门狗)&#xff1f;3. 如何使用 YAML 描述 DaemonSe?3.1 参考官网创建DaemonSet YAML3.1.1 DaemonSet YAML 和 Deployment YAML 文件对比3.1.2 DaemonSet YAML 和 Deployment YAML 文件对比图示3.2 用变通的方法来创建 DaemonSet 的 …

【Python模块】图形化编程模块-turtle

Turtle&#xff0c;也称海龟渲染器&#xff0c;是 Python 内置的图形化模块&#xff0c;它使用 tkinter 实现基本图形界面&#xff0c;因此 当前使用的 Python 环境需要支持 tkinter。 Turtle 提供了面向对象和面向过程两种形式的海龟绘图基本组件。使用它可以轻松的实现图形的…

初探Golang语法巩固复习

最近在家&#xff0c;重新拾起Go语言&#xff0c;搭建环境可参考之前博客【初探Golang语言之环境搭建】&#xff0c;本文是基本语法熟悉与练习&#xff0c;方便备查。 判断语句 if && switch if 通过指定一个或多个条件&#xff0c;并通过测试条件是否为true来决定是…

[附源码]计算机毕业设计springboot驾校预约管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

xcode swift 单元测试 test

XCTest是苹果官方的测试框架&#xff0c;是基于OCUnit的传统测试框架&#xff0c;测试编写起来非常简单。 测试案例一 创建一个单元测试 func testExample() throws {let personID:String "0123456789"let count personID.countXCTAssert(count < 10, "I…

aPaaS是什么(aPaaS平台和IPaaS的区别是啥?大白话解释)

依题&#xff1a;aPaaS是什么&#xff1f;aPaaS与iPaaS二者之间的区别在哪&#xff1f;要想了解区别&#xff0c;首先得搞清概念&#xff0c;不然就是在耍流氓&#xff01;下面本人就从概念到区别用大白话给你一次性讲清楚。 一、什么是aPaaS&#xff1f; 应用程序平台即服务&…

freeswitch配置SBC的方案

概述 freeswitch 是一款好用的开源软交换平台。 但是&#xff0c;fs不是专为SBC而开发的&#xff0c;所以需要做一些定制化的配置和开发。 本文主要介绍如何利用fs的基本功能配置一个简单的SBC方案&#xff0c;满足一般化需求&#xff0c;如果有定制化的需求需要定制开发。 …

QT简单串口通信终端实现

1.工程文件 工程文件中添加serilport QT serialport 2.主程序 主程序文件main.cpp #include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } …

xray长亭是自动化Web漏洞扫描神器

xray长亭一款完善的安全评估工具&#xff0c;支持常见 web 安全问题扫描和自定义 。 xray 是一款功能强大的安全评估工具&#xff0c;由多名经验丰富的一线安全从业者呕心打造而成&#xff0c;主要特性有: 检测速度快。发包速度快; 漏洞检测算法效率高。支持范围广。大至 OWAS…

Python error:Compressed file ended before the end-of-stream marker was reached

功能描述 在做http协议处理时&#xff0c;经常遇到gzip格式的数据需要进行还原解压缩处理。 解压缩用到的Python库为 import gzip 报错 unpack_gzip error:Compressed file ended before the end-of-stream marker was reached 压缩文件在到达流结束标记之前结束 原因 该…

上海亚商投顾:沪指创反弹新高 房地产板块掀涨停潮

上海亚商投顾前言&#xff1a;无惧大盘大跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪三大股指今日窄幅震荡&#xff0c;最终尾盘小幅收红。房地产板块午后跳水&#xff0c;首开股份跌停&#xff0c;粤宏…

遥感指数应用汇编

引言 现在遥感应用领域&#xff0c;尤其是农业遥感、土地覆盖、矿物识别等等地物精细识别探测任务中&#xff0c;遥感指数已经如日中天。它们的共同特点都是采用了比值运算和归一化(normalization)处理。因此数值范围介于{-1&#xff0c;1}之间。由于进行了比值计算&#xff0c…

虹科活动 | SWCF 2022卫星通信与仿真测试线上研讨会倒计时,快来报名吧!

您是否在因线下论坛的地点限制而错失技术干货分享&#xff1f;您是否因时间安排而无法亲临现场与行业专家交流&#xff1f;虹科举办全新线上论坛SWCF&#xff0c;与行业专家一起为您带来最新热点话题讨论与技术干货分享&#xff01; 什么是SWCF 虹科每年将开展卫星与无线通信…

架构重构技巧

架构重构定义 代码重构 定义 对软件代码做任何改变以增加可读性或者简化结构而不影响输出结果 目的 增加可读性、增加可维护性、可扩展性 关键点 不影响输出不修正错误不增加新的功能性 架构重构 定义 通过调整系统结构&#xff08;Rank、Role、Relation、Rule&#…

Java8--Stream的各种用法(二):collect、Collectors

Collectors中的方法&#xff1a; 其中我们常用的是前三个&#xff1a;将流中的元素放到集合中、分组、toMap。 下面我们逐个介绍这些方法的使用. 基础类&#xff1a; Student public class Student {private Integer id;private String name;private String className;priva…

Linux21 --- 计算机网络基础概论(网络基本概念、网络分层模型、网络应用程序通信流程)

一、网络基本概念 1、网络 网络是由若干结点和连接这些结点的链路组成&#xff0c;网络中的结点可以是计算机&#xff0c;交换机、 路由器等设备。 网络设备有&#xff1a;交换机、路由器、集线器 传输介质有&#xff1a;双绞线、同轴电缆、光纤 下图是一个简单的网络示意图…