力扣刷题笔记-06 N字形变换

这篇具有很好参考价值的文章主要介绍了力扣刷题笔记-06 N字形变换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

06 N字形变换

不要混日子,小心日子把你混了

对于题目的理解

比如说,我给一个字符串,LEETCODE,行数为3,然后按照N字形排列,就是下面这个排列方式。排列完之后正常读取,结果就是LCETOEED。这叫做N字形变换。

这个例子里给的行数就是3,往下排三行,然后往右往上走。

chatGPT

思路

  1. 边界情况/特殊情况:就给一行,或者给的行数和字符串的长度是一样的,那么就直接返回原来的字符串
  2. 创建一个长度为numRows的字符数组rows,用于存储每行的字符

。。。没抄完,但是我已经理解了。

我的理解:

  1. 准备一个数组,类型是StringBuilder,StringBuilder[] rows = new StringBuilder[numRows];容量为给定的行数 numRows,每一个数组元素代表一行。为什么每个数组元素代表一行呢?这里困扰了很久,其实很简单,玄机就在于声明的是StringBuilder类型的。我们在排列的时候是从上往下排列的,所以这里也是从上往下填充数组,每个元素代表一行。当这一列填充结束的时候,就去下一列,仍旧是对row[index]这个元素,也就是对应行的元素,但是这里是append,自然就把这一行元素拼接上来了
  2. 定义一个index ,初始值为0,用来标志是哪一行;
  3. 定义一个step,初始值是1,用来标记是向上走还是向下走,1表示向下,-1表示向上
  4. 考虑边界情况:
    1. index==0;此时在第一行,应该往下走。step设置为1,index = index+step,这样的话就会是一直在向下走
    2. 向下走到index = numRows-1,表示走到最下面一行了,该向上走了,这个时候把step设置为-1,index= index+step,这样就相当于在向上走。
  5. 遍历字符串s
  6. 遍历结束以后,再去遍历数组,拼接,就是N字形变换之后的结果了。

上代码:

/**
 * 首先要理解怎么算是N字变换
 * 一个正常的字符串,按照给定的行数,从上到下,斜着向上,再向下,就像N字一样
 *
 * 解决这个问题的思路是假如给了4行,那就申请一个StringBuilder数组,大小容量也是4
 * 遍历给定的字符S,从上往下,向数组元素添加,但是这里的添加是append,下次走到这一行,仍旧append,这样就拼进去了
 * 虽然我知道这样讲可能没讲明白,那我在换个说法
 *
 * 1. 每个数组元素代表一行的字符串,注意这里的一行指的是N字形排列之后的一行
 * 2. 题目给了多少行,数组里就有多少个元素,用了StringBuilder这个类型,就可以直接拼接,拼接一整行。
 * 3. N字形边界情况:一开始是向下,然后到了最底下,应该向上走了。所以我们需要两个变量,一个用来指示从上往下到第几行,一个用来指示
 * 要不要转换方向。这里不用考虑向右走,因为向右走就是在数组元素后面append一个字符。当index是0的时候,应该向下走,可以让index+1,
 * 当index是给定的行数numRows-1的时候,应该向上走,就是index-1。
 * @param s
 * @param numRows
 * @return
 */
class Solution {

    public String convert(String s, int numRows) {

        // 如果行数是1或者是字符串的长度,直接返回字符串
        if (numRows == 1 || s.length() <= numRows) {
            return s;
        }

        // 准备数组用来存放字符
        StringBuilder[] rows = new StringBuilder[numRows];
        // 初始化数组
        for (int i = 0; i < numRows; i++) {
            rows[i] = new StringBuilder();
        }

        // 标记在哪一行
        int index = 0;
        // 标记往下走还是往上走
        int step = 1;

        // 遍历字符串
        for (char c : s.toCharArray()) {
            rows[index].append(c);
            if (index == 0){
                
                
                // 此时表示最上面一行,应该是往下走,就+1;直到走到else里,说明到底了
                step = 1;
        } else if (index == numRows - 1) {
            // 这里说明到底了,就-1,往上走,直到index == 0;
            step = -1;
        }
    
            index += step;
        }
        
        // 拼接字符串
        StringBuilder result = new StringBuilder();
        for (StringBuilder row : rows) {
            result.append(row);
        }
        return result.toString();
    }
}

划重点:

我一开始想,可能是用二维数组来记录,因为有横竖的类似于表格的排列,所以很长一段时间内无法理解为什么是一个一维数组就能解决 StringBuilder[] rows = new StringBuilder[numRows];巧妙的地方在于 StringBuilder,数组容量是行数,列数不用考虑,因为StringBuilder可以append,往后无限增加列,这就相当于是二维数组了。但是这里有一点不得不注意,你要对数组初始化。文章来源地址https://www.toymoban.com/news/detail-711849.html

到了这里,关于力扣刷题笔记-06 N字形变换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 力扣刷题笔记-86 单链表的分解

    你说你会改变,但是你只是为了解决当时的冲突而讲的话。 给你一个链表头节点head和x,要求链表中所有小于x的节点都出现在大于或等于x的节点之前 例如:head = [1,4,3,2,5,2], x = 3; 输出:[1,2,2,4,3,5] 在合并两个链表的时候,是将两个链表合并成一个,拆分的时候,是将一个链表

    2024年03月13日
    浏览(25)
  • 【力扣刷题 | 第十六题】

    目录 前言: 198. 打家劫舍 - 力扣(LeetCode) 213. 打家劫舍 II - 力扣(LeetCode)  总结: 我们今天继续刷动态规划的题,希望大家可以和我一起坚持下去。 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有

    2024年02月15日
    浏览(31)
  • 【力扣刷题 | 第七天】

    今天我们将会进入栈与队列的刷题篇章,二者都是经典的数据结构,熟练的掌握栈与队列实现可以巧妙的解决有些问题。 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的

    2024年02月09日
    浏览(37)
  • 【力扣刷题 | 第十三天】

    今天随机进行练习,题型上不会有什么限制,主要还是练习STL算法。 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意:最终,合并

    2024年02月10日
    浏览(37)
  • 力扣刷题19天

             这道题下面是前提:                                           如果没有这个前提,会出现下面情况(前序遍历会变成新的树):         运行代码:           下面代码中出现的问题:         和上面那道题逻辑一样。         运行代码:          

    2024年02月04日
    浏览(31)
  • 力扣刷题 - 数组篇

    https://leetcode.cn/problems/max-consecutive-ones/ 暴力解法: 定义一个变量来统计是否连续 https://leetcode.cn/problems/teemo-attacking/ 暴力解法: 记录每次中的开始时间与结束时间, 然后如果下一次中毒的是在结束时间之前, 就去更新开始时间(让它加上这个持续时间减去结束时间),如果是在之后

    2024年02月16日
    浏览(32)
  • 【力扣刷题 | 第十五天】

    目录 前言:  ​​​​​​​63. 不同路径 II - 力扣(LeetCode) 343. 整数拆分 - 力扣(LeetCode) 总结:         本篇我们主要刷动态规划的题,解题还是严格按照我们在【夜深人静写算法】栏目下的解题步骤,大家如果没学过动态规划的可以先看看我写的动态规划文章介绍。

    2024年02月15日
    浏览(35)
  • 力扣刷题:删除重复元素

    当处理排序数组时,删除重复元素是一个常见的问题。首先,我们来看一下如何解决这个问题,然后再进一步讨论如何处理允许最多重复两次的情况。 问题描述:给定一个已排序的数组,删除重复的元素,使得每个元素只出现一次,并返回新的长度。 使用双指针方法。一个

    2024年02月13日
    浏览(37)
  • 【力扣刷题 | 第十七天】

    目录 前言: 55. 跳跃游戏 - 力扣(LeetCode) 45. 跳跃游戏 II - 力扣(LeetCode) 总结:         今天两道类型都是贪心算法,希望可以有所收获 给定一个非负整数数组  nums  ,你最初位于数组的  第一个下标  。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断

    2024年02月15日
    浏览(33)
  • 力扣刷题【第一期】

    1.爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 2.求两数的和(283) 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下

    2024年02月07日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包