6. N 字形变换

news/2024/11/28 23:34:11/

6. N 字形变换

  • 题目描述
  • 解题思路
    • Code1
    • Code2
    • Code3

题目描述


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

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

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,输出:"PAHNAPLSIIGYIR"。


比如输入字符串为 **"PAYPALISHIRING"** 行数为 **4** 时,排列如下
P     I    N
A   L S  I G
Y A   H R
P     I

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,输出:"PINALSIGYAHRPI"。


若s = "A", numRows = 1,那么输出 **"A"**

解题思路

根据题意可知,我们要遍历整个字符串,然后将其“拼装”为一个Z字型。 那么,在执行拼装操作时,其实就是一个“从上向下”,当长度达到numRow的时候,在执行反方向的“从下向上”。
那么,对于每层的元素,我们可以通过StringBuilder数组进行保存,那么对应数组存储的下标index,我们需要一个boolean变量reverse,当它为false的时候,index执行加1操作,当它为true时,index执行减1操作。当所有字符串s都遍历并存储到StringBuilder数组之后,我们再执行最后结果拼装即可。具体操作如下所示:

在这里插入图片描述

Code1

public static String convert(String s, int numRows) {if (numRows == 1 || s.length()<=2) return s;StringBuilder[] str_arr = new StringBuilder[numRows];for (int i = 0; i < numRows; i++) {str_arr[i] = new StringBuilder();}boolean flag = true; // 当flag为真时,数值升序。反之则是降序int index = 0;for (int i = 0; i < s.length(); i++) {str_arr[index].append(s.charAt(i));if (index == 0) flag = true;if (index == numRows-1 ) flag = false;index = flag ? index + 1 : index - 1;}String res = "";for (StringBuilder a: str_arr) {res += a;}return res;
}

str_arr 也可以这么定义
String[] str_arr = new String[numRows];
for (int i = 0; i < numRows; i++) {
str_arr[i] = “”;
}
那么数组里字符的拼接就可以直接加 str_arr[index] += s.charAt(i);

上述代码的核心是这个下标升序和降序的过程

int[] num_arr = new int[s.length()];
boolean flag = true; // 当flag为真时,数值升序。反之则是降序
int index = 0;
for (int i = 0; i < s.length(); i++) {num_arr[i] = index;if (index == 0) flag = true;if (index == numRows-1 ) flag = false;index = flag ? index + 1 : index - 1;
}
System.out.print(num_arr);// (14) [0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1]

Code2

下标的升降,也可以用变量n,然后求余数来控制。

int[] num_arr = new int[s.length()];
int n = 2 * numRows - 2;
int index;
for (int i = 0; i < s.length(); i++) {index = i % n;if (index >= n - index) {num_arr[i] = n - index;} else {num_arr[i] = index;}
}
System.out.print(num_arr);// (14) [0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1]

Java代码就不写了,这回改用python。不为别的,就为简洁。

def convert(s, numRows):if numRows == 1: return sres, n = [''] * numRows, 2 * numRows - 2for i, c in enumerate(s):res[min(idx := i % n, n - idx)] += creturn ''.join(res)

Code3

核心算法,还是熟悉的样子

int[] num_arr = new int[s.length()];
int index;
for(int i=0;i<s.length();i++){index = i % (numRows*2-2);if(index >= numRows) index=(numRows-1)-(index-numRows+1);num_arr[i] = index;
}
System.out.print(num_arr);// (14) [0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1]
public static String convert(String s, int numRows) {if (numRows == 1 || s.length()<=2) return s;String[] str_arr = new String[numRows];for (int i = 0; i < numRows; i++) {str_arr[i] = "";}int index;for(int i=0;i<s.length();i++){index = i%(numRows*2-2);if(index>=numRows) index=(numRows-1)-(index-numRows+1);str_arr[index]+=s.charAt(i);}String res = "";for (String a: str_arr) {res += a;}return res;
}

http://www.ppmy.cn/news/243807.html

相关文章

“专精特新”发展概况

专精特新概念自2011年开始萌芽&#xff0c;2021年上升为国家战略&#xff0c;2022年写进二十大报告&#xff0c;顶层设计持续推进&#xff0c;旨在聚焦产业链关键环节&#xff0c;加强技术创新&#xff0c;破解核心技术“卡脖子”问题。全国各地政府从企业调研、整体设计、培育…

MES系统选择指南:企业如何选择适合需求的MES管理系统?

MES&#xff08;Manufacturing Execution System&#xff09;管理系统是一种用于生产管理的软件系统&#xff0c;可以帮助企业提高生产效率、降低成本和提高质量。然而&#xff0c;不同类型的MES管理系统适用于不同类型的企业需求&#xff0c;因此选择适合自己企业需求的MES管理…

ANDROID手表怎么设置壁纸,表盘背景随心换 果壳智能手表换壁纸教程

在智能手机和电脑上&#xff0c;我们一般都会换一张自己喜欢的图片作为壁纸&#xff0c;当我们想把一张喜欢的图片做成果壳GEAK Watch表盘时&#xff0c;应该怎么做呢&#xff1f;其实只要简单的几个步骤&#xff0c;你就能获得独一无二的专属表盘。 首先&#xff0c;打开一张你…

斐讯手表怎么刷机华为系统_智能手表怎么刷机?

展开全部 可以直接拿到手机62616964757a686964616fe59b9ee7ad9431333365633937店去刷。 三星手机刷机问题&#xff1a; 1、三星官网没有手机刷机(fastboot模式\工厂代码\工程模式/rom/基带/recovery/水货修改中文)等相关资料提供。 2、由于自行刷机写入系统存在风险性&#xff…

案例分享——智能手表(全套解决方案:生理监测、久坐提醒、来电提醒、OTA、无线通信、语音播报、长时间待机等)

【系列专栏】&#xff1a;博主结合工作实践输出的&#xff0c;解决实际问题的专栏&#xff0c;朋友们看过来&#xff01; 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》 《Android开发实战》 《实用硬件方案设计》 长期持续带来更多案例与技术文章分享…

ESP32S3+双模蓝牙智能手表项目总目录

我个人觉得网上没有一个系统的智能手表的全面的深入教程&#xff0c;可能大家偏向的方法总是冰山一角&#xff0c;比如蓝牙应用&#xff0c;WiFi应用&#xff0c;外设应用&#xff0c;或者GUI LVGL等&#xff0c;所以我们想打造一个ESP32S3双模蓝牙芯片的教程&#xff0c;只看我…

智能手表连接电脑及adb测试

智能手表连接电脑及adb测试&#xff0c;搞开发用&#xff0c;以huawei watch 2 为例&#xff1a; 1.usb连接手表与电脑 2.电脑端安装adb驱动 3.手表端打开开发者模式&#xff08;点击版本号7次以上&#xff09;&#xff0c;打开adb调试 4.电脑端安装adb工具 5.cmd进入adb工…

鸿蒙系统 智能手表,wear os智能手表和鸿蒙系统智能手表对比

本帖最后由 KevinXu1225 于 2020-11-27 09:24 编辑 我昨天中午刚收到了GS pro,由于使用方法和操作界面和之前用过的magic watch2并没有什么差别,所以基本上不需要研究即可直接上手使用了。之前换掉magic watch2 的主要原因是觉得手表没法安装第三方软件,虽然其他方面都很不错…