从零学算法6

6. Z 字形变换
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:

	P   A   H   NA P L S I I GY   I   R

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入:s = “PAYPALISHIRING”, numRows = 3
输出:“PAHNAPLSIIGYIR”
示例 2:
输入:s = “PAYPALISHIRING”, numRows = 4
输出:“PINALSIGYAHRPI”
解释:

P     I    N
A   L S  I G
Y A   H R
P     I

示例 3:
输入:s = “A”, numRows = 1
输出:“A”
提示:
1 <= s.length <= 1000
s 由英文字母(小写和大写)、‘,’ 和 ‘.’ 组成
1 <= numRows <= 1000

  • 我的原始人解法(可略):模拟,找到变换规律。首先 row 为 1 返回 s 即可;然后用字符二维数组 res 记录变换后的形状,比如例子 2,可以分为 3 列一组,每一列的长度为 numRows,1,1,numRows 为其他时同理,可分为 numRows - 1 列一组,每一组长度为 numRows,1,1。根据这个规律,我们可以得到所需的列有多少列。
  • 分组示意图
  •  P        	I    			NA   L    	S  I GY A      	H RP        	I
    
  • 然后就是遍历 s 根据规律将字符加入 res,先在当前列从上到下加 numRows 个字符,然后将字符加入下一列的倒数第二行,下一列倒数第三行…直到下一列的第二行,就完成一组,之后同理
  •   public String convert(String s, int numRows) {if(numRows == 1)return s;int len = s.length();int numCols = getNumCols(len, numRows);char[][] res = new char[numRows][numCols];int col = 0;int i = 0;StringBuilder sb = new StringBuilder();while(col < numCols){int row = 0;// 先加 x 列一组中的第一列while(i < len && row < numRows){res[row++][col] = s.charAt(i++);}col++;// 剩下的行数从倒数第二行开始row = numRows - 1 - 1;// 再加 x 列一组的剩下列,每一列有一个字符while(i < len && row > 0){res[row--][col++] = s.charAt(i++);}}for(char[] cs : res){for(char c : cs){if(c != '\u0000')sb.append(c);}}return sb.toString();}// 计算有几列public int getNumCols(int len, int numRows){int[] nums = new int[numRows - 1];Arrays.fill(nums, 1);nums[0] = numRows;int numCols = 0;while(len > 0){for(int i = 0; i < nums.length; i++){len -= Math.min(len, nums[i]);numCols++;if(len == 0)break;}}return numCols;}
    
  • 他人解法:其实观察过后会发现,字符所放的行数就是从 0 ~ numRows-1 -> numRows-1 ~ 0 -> 0 ~ numRows-1... 循环变动,我们定义一个 stringBuilder 数组 rows,跟随行变化规律拼接字符即可。
  • 比如 “abcde”,numRows = 3,就是把 a 加入第一行, 得到 rows[0] = a,然后把 b 加入第二行 rows[1] = b -> rows[2] = c -> rows[1] = bd -> rows[0] = ae,最终把每一行的结果拼接到一起:ae + bd + c = aebdc
  •   public String convert(String s, int numRows) {if(numRows == 1)return s;List<StringBuilder> rows = new ArrayList<StringBuilder>();for(int i = 0; i < numRows; i++) rows.add(new StringBuilder());// flag: 行变化规律标志,控制 rowIndex 递增还是递减int rowIndex = 0, flag = -1;for(char c : s.toCharArray()) {rows.get(rowIndex).append(c);// 行到顶部就该往下递增,到底部就该往上递减,所以改变 flagif(rowIndex == 0 || rowIndex == numRows - 1)flag = -flag;rowIndex += flag;}StringBuilder res = new StringBuilder();for(StringBuilder row : rows) res.append(row);return res.toString();}
    

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

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

相关文章

Python3 笔记:分支结构

Python 中选择结构&#xff1a;单分支选择结构、双分支选择结构、多分支选择结构。 1、if 语句是单分支选择结构&#xff0c;其语法形式如下&#xff1a; if 条件表达式: 语句块 如果条件表达式的值为真&#xff0c;即条件成立&#xff0c;语句块将被执行&#xff1b;否…

出租车计价器设计与实现(论文 + 源码)

关于java出租车计价器设计与实现.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89304164 出租车计价器设计与实现 摘 要 在我国&#xff0c;出租车行业是八十年代初兴起的一项新兴行业&#xff0c;随着出租车的产生&#xff0c;计价器也就应运而生。但当时在全…

MySQL视图简介

# MySQL视图简介 在数据库管理中&#xff0c;视图&#xff08;View&#xff09;是一个虚拟表&#xff0c;其内容由查询定义。与包含数据的实际表不同&#xff0c;视图只存储定义它的SQL查询语句&#xff0c;并在查询视图时动态生成结果集。MySQL视图功能强大&#xff0c;能简化…

【异常】SpringBoot整合RabbitMQ-发送消息报错

错误信息 reply-code406, reply-textPRECONDITION_FAILED - inequivalent arg ‘x-message-ttl’ for queue ‘hello-queue’ in vhost ‘/lq’: received none but current is the value ‘10000’ of type ‘signedint’, class-id50, method-id10 错误原因 hello-queue这…

日志的基本用法

目标 1. 掌握如何设置日志级别 2. 掌握如何设置日志格式 3. 掌握如何将日志信息输出到文件中 1. logging模块 Python中有一个标准库模块logging可以直接记录日志 1.1 基本用法 import logging logging.debug("这是一条调试信息") logging.info("这是一条…

迪安诊断数智中心战略与PMO负责人徐黎明受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 迪安诊断技术集团股份有限公司数智中心战略与PMO负责人徐黎明先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“软件研发项目管理指标体系建设实践”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xff01; …

01-项目功能,架构设计介绍

稻草快速开发平台 开发背景就是通过此项目介绍使用SpringBoot Vue3两大技术栈开发一个拥有动态权限、路由的前后端分离项目&#xff0c;此项目可以继续完善&#xff0c;成为一个模板为将来快速开发做铺垫。 实现功能 开发流程 通过命令构建前端项目在VSCode中开发&#xff…

【话题】Agent AI智能体的未来

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景一、Agent AI智能体的角色二、Agent AI智能体的发展路径三、Agent AI智能体可能带来的挑战文章推荐 背景 随着Agent AI智能体的智能化水平不断提高&#xff0c;它们…

Android----USB通信

在Android开发中实现USB通信&#xff0c;通常涉及到与USB设备的交互&#xff0c;包括请求设备权限、与设备通信等步骤。以下是一个简化的流程&#xff0c;展示了如何在Android应用程序中实现USB通信&#xff1a; 1. 添加USB权限和特性声明 首先&#xff0c;需要在AndroidMani…

Llama3中文聊天项目全能资源库

Llama3 中文聊天项目综合资源库&#xff0c;集合了与Lama3 模型相关的各种中文资料&#xff0c;包括微调版本、有趣的权重、训练、推理、评测和部署的教程视频与文档。1. 多版本支持与创新&#xff1a;该仓库提供了多个版本的Lama3 模型&#xff0c;包括基于不同技术和偏好的微…

STK12 RPO模块学习(2)

一、Coast RPO Sequence 这个序列运行卫星直到它达到了下面三个条件之一。 1&#xff09;截至时间。2)圈数到达了限制。3&#xff09;其他条件&#xff0c;比如近地点。 默认情况下&#xff0c;Astrogator使用“Earth HPOP Default v10”预报器。你能够修改呈其他修改器。下…

【Linux线程(一)】线程初理解

前言&#xff1a; &#xff08;一&#xff09;线程的概念 &#xff08;二&#xff09;线程的理解 &#xff08;三&#xff09;示例 &#xff08;四&#xff09;线程优缺点 线程的优点 线程的缺点 &#xff08;五&#xff09;线程和进程的切换 1.线程的切换 2.进程的切换…

【Docker学习】重启容器的docker restart

命令&#xff1a; docker container restart 描述&#xff1a; 重启一个或多个容器 用法&#xff1a; docker container restart [OPTIONS] CONTAINER [CONTAINER...] 别名&#xff1a; docker restart(docker的一些命令可以简写&#xff0c;docker restart就等同于docker cont…

Vue3响应式原理实现与track和trigger依赖收集和触发依赖

前言 Vue的响应式系统是基于数据劫持加发布订阅者模式实现的&#xff0c;数据响应式就是建立响应式数据与依赖的关系 (调用了响应式数据的操作之间的关系) vue2使用Object.defineProperty进行数据拦截,而Vue3使用Proxy进行数据拦截是es6中新加的api,比Object.defineProperty解…

对Windows超融合S2D的一些补充

先说一个不知道算不算BUG的例子&#xff0c;下面这个存储池是用两台服务器各2块10G建立的&#xff0c;除去系统保留的部分&#xff0c;显示还有13G可用。 但如果使用其新建虚拟磁盘会显示可用的空间为0 然后我又各增加了一块10G硬盘进池&#xff0c;变成了可用空间为30.5GB …

JavaEE之线程(4)——线程安全、线程安全的原因,synchronized关键字

前言 在本栏的前面的内容中&#xff0c;我们介绍了线程的创建、Thread 类及常见方法、线程的状态&#xff0c;今天我们来介绍一下关于线程的另一个重点知识——线程安全。 一、线程安全 基本概念&#xff1a; 线程安全的确切定义是复杂的&#xff0c;但我们可以这样认为&…

哪里可以找到可靠的代理IP?

需要代理来访问受限制的网站或改善您的在线隐私&#xff1f;别再犹豫了&#xff01;在这篇博文中&#xff0c;我们将探讨您可以使用的选项&#xff0c;并提供有关在哪里获取代理的指导。 首先&#xff0c;让我们了解什么是代理及其工作原理。代理充当您的设备和互联网之间的中介…

mybatis 设置字段值为null 不生效不起作用 解决办法

mybatis 设置字段值为null 不生效不起作用 解决办法 问题 updateObj.setPublishTime(null);int update protocolMapper.updateById(updateObj);执行之后&#xff0c;不生效&#xff0c;数据库里仍有值 解决 在需要设置null的字段加上 TableField(updateStrategy FieldStra…

《Mybatis》系列文章目录

什么是 MyBatis&#xff1f; MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff…

【触想智能】无风扇工控一体机的优点与定制要求分析

随着工业自动化的不断推进&#xff0c;工控一体机作为自动化生产的核心设备&#xff0c;在工业生产中发挥着越来越重要的作用。 在工控一体机的设计中&#xff0c;散热是一个非常关键的问题&#xff0c;而无风扇工控一体机的出现为解决这个问题提供了新方法。 无风扇工控一体机…