leetcode 6. N 字形变换(medium)(优质解法)

链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

代码:

class Solution {public String convert(String s, int numRows) {if(numRows == 1) {return s;}int length=s.length();StringBuilder ret=new StringBuilder();//获取排列后 0 行(首行)的字符int index=0;int d=2*numRows-2;while(index<length){ret.append(s.charAt(index));//更改下标 indexindex+=d;}//获取排列后 1 ~ numRows-2 行的字符for(int k=1;k<=numRows-2;k++){int i=k,j=d-i;while(i<length||j<length){if(i<length){ret.append(s.charAt(i));}if(j<length){ret.append(s.charAt(j));}i+=d;j+=d;}}//获取排列后 numRows-1(末行)的字符index=numRows-1;while(index<length){ret.append(s.charAt(index));index+=d;}return ret.toString();}
}

题解:

        本题没有什么技巧,按照题目要求模拟题目描述的过程即可,最好通过画图找到其中的逻辑关系,以示例2为例,画出如下的图:

        可以来找以下其中含有的规则,我们要获取的正确答案就是从左到右逐行读取,首先要读取的是第 0 行(首行),读取到 P I N ,在字符串中的下标对应为 0 ,6 ,12,下标之间相差 6 ,P 到 L 有 6 个字符,所以递增的增量 d = 2*numRows - 2 ,2*4-2 = 6 ,所以要填充第一行的字符时,可以直接找到以 0 开始,增量为 d = 2*numRows - 2 的合法下标对应的字符

        对于 1 ~ numRows - 2 行的字符,可以每两个字符为一组,如字符 A ,L 为一组,A 的下标为 1 (行的下标与第一个字符的下标相同),L 的下标为 5 ,可以发现 L 下标为 d - A下标,所以根据行数可以得到 A, L字符的下标,S 的下标为 7 = A 的下标 + d ,I 的下标 = L 的下标 + d ,通过<A,L> 这两个下标分别加上 d ,得到下一组字符的下标,获取所有符合条件的下标对应的字符即可

        对于 numRows -1 行(尾行),第一个字符 P 的下标为 3 = 当前的行的下标,下一个字符 I 的下标为 9 ,可以看出与首行相同,字符的下标按照增量 d = 2*numRows - 2 递增,根据该规则获取符合条件的下标对应的字符即可

        通过上述分析,已经知道了每一行字符下标的规则,只需要按照该规则去一行一行的获取字符拼接到字符串中即可

        要注意该题有特殊情况,当 numRows = 1  时数据要放到一行上,进行排序后和原数组相同,直接返回原数组即可

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

选择排序之C++实现

描述 选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法。它的基本思想是&#xff1a;每一轮从待排序的数据中选择最小&#xff08;或最大&#xff09;的一个元素&#xff0c;然后与待排序数据的第一个元素交换位置。对剩余未排序的数据重复这个过程&a…

C++ 基础

……………………………………………………………………………… 命名空间&#xff1a; 在 C语言环境中&#xff0c;当变量或函数发生冲突的时候&#xff0c;编译器会报错。在一些大工程中不同的板块往往由不同的人员进行编写&#xff0c;合并到一块时可能会出现名字冲突&…

Autosar CAN开发03(从实际应用认识CAN总线的物理层)

建议同时阅读本专栏的&#xff1a; Autosar CAN开发03&#xff08;从实际应用认识CAN总线的物理层&#xff09; Autosar CAN开发04&#xff08;从实际应用认识CAN报文&#xff09; Autosar CAN开发05&#xff08;从实际应用认识CAN波特率&#xff09; 前言 在上一章的《AU…

基于Python的新能源汽车销量分析与预测系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 基于Python的新能源汽车销量分析与预测系统是一个使用Python编程语言和Flask框架开发的系统。它可以帮助用户分析和预测新能源汽车的销量情况。该系统使用了关系数据库进行数据存储&#xff0c;并…

thinkphp6.0的workerman在PHP8.0下报错

一、我先升级了thinkphp6.0到最新版本&#xff1a; composer update topthink/framework二、结果提示我composer版本过低&#xff0c;需要升级到2&#xff0c;于是我又升级了composer composer self-update 三、我又升级了workerman: composer require topthink/think-work…

深入理解 Spring Boot:核心知识与约定大于配置原则

深入理解 Spring Boot&#xff1a;核心知识与约定大于配置原则 简单说一下为什么要有 Spring Boot&#xff1f; 因为 Spring 的缺点。 虽然 Spring 的组件代码是轻量级的&#xff0c;但它的配置却是重量级的(需要大量 XML 配置) 为了减少配置文件&#xff0c;简化开发 Spri…

低代码实施复杂应用的实践方法

内容来自演讲&#xff1a;韦有炬 | 柳州知行远企业管理咨询有限公司 | 总经理 摘要 本文探讨了在全民开发时代如何使用低代码实施复杂应用并降低上线风险。文章分析了复杂系统实施失败的风险&#xff0c;包括项目规划不周、人员变动、企业基础管理不足等&#xff0c;并对比了低…

市场复盘总结 20231225

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整 昨日回顾&#xff1a; SELECT CODE,成交额排名,净流入排名,代码,名称,DDE大单金额,涨幅,主力净额,DDE大单净量,CONVERT(DATETIME, 最后封…

CSRF(Pikachu)

CSRF&#xff08;get&#xff09; 首先我们先登录账号 admin 密码是&#xff1b;123456 点击修改个人信息 用F12或者BP 抓包看看我们的url 那么构成的CSRF攻击payload为http://pikachu.shifa23.com/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sexboy&phonenum”手机…

智能优化算法应用:基于卷积优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于卷积优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于卷积优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.卷积优化算法4.实验参数设定5.算法结果6.…

让某个页面一直处于最前面,可以屏蔽切屏检测

前言 学习通智慧树网课分屏&#xff0c;让某个页面一直处于最前面&#xff0c;可以屏蔽切屏检测。 页面一直处于最前面 前言1 安装包2 使用 1 安装包 https://download.csdn.net/download/qq_44850489/76684366 2 使用 一直下一步就可以 选择要放到前面的窗口&#xff0c…

摸索若依框架是如何实现权限过滤的

摸索若依框架是如何实现权限过滤的 这篇文章&#xff0c;我也是作为一个优秀开源框架的学习者&#xff0c;在这里摸索这套框架是如何实现权限过滤的&#xff0c;这个封装对于入行Java半年之余的我来说&#xff0c;理解起来有些困难&#xff0c;所以&#xff0c;文章只是作为一个…