LeetCode50天刷题计划(Day 5—— Z 字形变换 10.50-13:00)

2023-10-17 23:30

本文主要是介绍LeetCode50天刷题计划(Day 5—— Z 字形变换 10.50-13:00),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、题目
    • Z 字形变换
    • 示例
    • 提示
  • 二、思路
    • 1.垃圾
    • 2.大佬
  • 三、代码
    • 1.python(二维数组模拟)
    • 2.c++(一维数组模拟)


前言

加油捏~

一、题目

Z 字形变换

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:

P   A   H   N
A P L S I I G
Y   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

二、思路

1.垃圾

鼠鼠啥也不会只会用二维数组模拟,还模拟的漏洞百出,尊的lay了
下面是一些bug
①“一个具有“不可变性”的对象,是一个在其创建以后不能够被改变的对象。例如,不能通过对字符串的某一位置进行赋值而改变字符串。”连接为字符串的函数的返回值为新字符串,而不是在原有字符串上更改: s_join=s_join.join(re_list[i])"".join(res)
②python字符串切片长度不够就切到尾为止,不会报错
③一要注意原始列表创建的大小;二要注意开始和结束的条件,否则会出现 超出index的错误

2.大佬

看到一维数组模拟 我人直接傻掉 妈妈问我为什么跪着看电脑呜呜呜QAQ
其实就是在图中,每行字符间的间隔是不重要的,没必要维持列间的结构,只需要把字符分到每行即可

https://leetcode.cn/problems/zigzag-conversion/solution/zzi-xing-bian-huan-by-jyd/

class Solution:def convert(self, s: str, numRows: int) -> str:#如果只有一行z,直接输出原字符串if numRows < 2: return s#几行z就建立几个字符串,第i个字符串代表第i行,字符串用一维列表存储res = ["" for _ in range(numRows)]#i代表行,也就是第i个字符串,flag表示方向,-1表示向上,1表示向下i, flag = 0, -1#遍历s中的字符for c in s:#每次存入当前行中一个字符res[i] += c#当i=0(首行)或i=numRows - 1(尾行)时,flag反向if i == 0 or i == numRows - 1: flag = -flag#i更新i += flag#返回结果return "".join(res)

三、代码

1.python(二维数组模拟)

class Solution:def convert(self, s: str, numRows: int) -> str:#字符串长度n=len(s)if(numRows==1):return s#每组字符长度step=2*numRows -2#列表生成式生成有numRows行的二维列表,列表元素为空字符串re_list=[["" for j in range((n//step + 1)*(numRows - 1)+1)] for i in range(numRows)]#第几组group=0#遍历所有字符串,步长为组的长度for i in range(0,n,step):#本组字符串temp=s[i:i+step]+'0'#本组起始位置(列),从零开始的下标start=group*(numRows-1)#遍历本组每个字符串,j是本组字符串下标for j in range(step):#判断是否已经结束,一定要注意边界条件!if(temp[j]=='0'):break#放竖着的if(j<numRows):re_list[j][start]+=temp[j]#放斜着的else:#与竖着最后一个元素的横纵坐标绝对值abs_len = j-numRows+1#锁定坐标re_list[numRows-1-abs_len][start+abs_len]+=temp[j]#一组已经放好group+=1#按行输出即可re_str=""for i in range(numRows):s_join=""s_join=s_join.join(re_list[i])re_str+=s_joinreturn re_str

2.c++(一维数组模拟)

class Solution {
public:string convert(string s, int numRows) {//只有一行,直接返回if(numRows==1){return s;}//存放结果string re[numRows];for(int i = 0;i<numRows;i++){re[i]="";}//字符串长度int n=s.length();int row=0;int flag=-1;//遍历字符串for(int i=0;i<n;i++){re[row]+=s[i];if(row==0 || row==numRows-1){flag=-flag;}row+=flag;}//结果string re_str;for(int i = 0;i<numRows;i++){re_str+=re[i];}return re_str;}    
};

在这里插入图片描述

这篇关于LeetCode50天刷题计划(Day 5—— Z 字形变换 10.50-13:00)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/228682

相关文章

Oracle数据库执行计划的查看与分析技巧

《Oracle数据库执行计划的查看与分析技巧》在Oracle数据库中,执行计划能够帮助我们深入了解SQL语句在数据库内部的执行细节,进而优化查询性能、提升系统效率,执行计划是Oracle数据库优化器为... 目录一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 S

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

Linux基础入门 --9 DAY

文本处理工具之神vim         vi和vim简介 一、vi编辑器 vi是Unix及类Unix系统(如Linux)下最基本的文本编辑器,全称为“visual interface”,即视觉界面。尽管其名称中包含“visual”,但vi编辑器实际上工作在字符模式下,并不提供图形界面。vi编辑器以其强大的功能和灵活性著称,是Linux系统中不可或缺的工具之一。 vi编辑器具有三种主要的工作模

day-50 求出最长好子序列 I

思路 二维dp,dp[i][h]表示nums[i] 结尾,且有不超过 h 个下标满足条件的最长好子序列的长度(0<=h<=k),二维数组dp初始值全为1 解题过程 状态转换方程: 1.nums[i]==nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h]+1) 2.nums[i]!=nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h-1

[Day 73] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

AI在健康管理中的應用實例 1. 引言 隨著健康管理需求的提升,人工智能(AI)在該領域的應用越來越普遍。AI可以幫助醫療機構提升效率、精準診斷疾病、個性化治療方案,以及進行健康數據分析,從而改善病患的健康狀況。這篇文章將探討AI如何應用於健康管理,並通過具體代碼示例說明其技術實現。 2. AI在健康管理中的主要應用場景 個性化健康建議:通過分析用戶的健康數據,如飲食、運動、睡眠等,AI可

Vue day-03

目录 Vue常用特性 一.响应更新 1. 1 v-for更新监测 1.2 v-for就地更新 1.3 什么是虚拟DOM 1.4 diff算法更新虚拟DOM 总结:key值的作用和注意点: 二.过滤器 2.1 vue过滤器-定义使用 2.2 vue过滤器-传参和多过滤器 三. 计算属性(computed) 3.1 计算属性-定义使用 3.2 计算属性-缓存 3.3 计算属

13 transition数组的动画使用

划重点 动画:transitiontransition-group :数组动画数组的 添加 / 删除 豆腐粉丝汤 清淡又健康 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><me

《计算机视觉工程师养成计划》 ·数字图像处理·数字图像处理特征·概述~

1 定义         从哲学角度看:特征是从事物当中抽象出来用于区别其他类别事物的属性集合,图像特征则是从图像中抽取出来用于区别其他类别图像的属性集合。         从获取方式看:图像特征是通过对图像进行测量或借助算法计算得到的一组表达特性集合的向量。 2 认识         有些特征是视觉直观感受到的自然特征,例如亮度、边缘轮廓、纹理、色彩等。         有些特征需要通