模拟算法【2】

在这里插入图片描述

文章目录

    • 🥘6. N 字形变换
      • 🍲题目
      • 🫕算法原理
      • 🥣代码实现
    • 🥗38. 外观数列
      • 🍿题目
      • 🧂算法原理
      • 🧈代码实现

🥘6. N 字形变换

🍲题目

题目链接:6. N 字形变换 - 力扣(LeetCode)

将一个给定字符串 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

🫕算法原理

这题题目有点绕,直接看图:

image-20231129192136383

解法一:模拟

清楚题目的意思之后,这些过程我们是可以模拟出来的。

  • 首先创建一个ns.size()列的矩阵
  • 然后填字符,假设字符坐标为(x,y),从上往下,y轴不变,x填到x = n-1,然后斜着往上,(x-1,y+1),填到y=0即可,以次循环,知道字符填完为止
  • 最后遍历整个矩阵即可得出结果

但这个空间复杂度为O(len * n),时间复杂度为也为O(len * n)

解法二:找规律+模拟

采用模拟的相关题目算法优化,一般都是找规律进行优化

image-20231129202720475

我们将字符换成对应的下标,可以发现规律:

  • 第一行和最后一行的规律是一样的,它们递增是等于中间元素的个数
    即公差d = 2n -2
  • 中间行的可以看作两个一起移动的,它们相加正好等于d
    (k,d-k) -> (k+d,d-k+d)

🥣代码实现

class Solution {
public:string convert(string s, int numRows){//边界情况处理if(numRows == 1)    return s;string ans;int d = 2*numRows - 2;  //公差int n = s.size();//处理第一行for(int i = 0; i < n;i += d)ans += s[i];//处理中间行for(int k = 1; k < numRows-1; k++)  //  中间的每一行{for(int i = k, j = d-k; i < n || j < n; i += d, j += d){if(i < n)   ans += s[i];if(j < n)   ans += s[j];}}//处理最后一行for(int i = numRows-1; i < n; i+=d)ans += s[i];return ans;}
};

运行结果:

image-20231129204917105

🥗38. 外观数列

🍿题目

题目链接:38. 外观数列 - 力扣(LeetCode)

给定一个正整数 n ,输出外观数列的第 n 项。

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。

你可以将其视作是由递归公式定义的数字字符串序列:

  • countAndSay(1) = "1"
  • countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。

前五项如下:

1.     1
2.     11
3.     21
4.     1211
5.     111221
第一项是数字 1 
描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 "11"
描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 "21"
描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 "1211"
描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 "111221"

描述 一个数字字符串,首先要将字符串分割为 最小 数量的组,每个组都由连续的最多 相同字符 组成。然后对于每个组,先描述字符的数量,然后描述字符,形成一个描述组。要将描述转换为数字字符串,先将每组中的字符数量用数字替换,再将所有描述组连接起来。

例如,数字字符串 "3322251" 的描述如下图:

img

示例 1:

输入:n = 1
输出:"1"
解释:这是一个基本样例。

示例 2:

输入:n = 4
输出:"1211"
解释:
countAndSay(1) = "1"
countAndSay(2) ="1" = 一 个 1 = "11"
countAndSay(3) ="11" = 二 个 1 = "21"
countAndSay(4) ="21" = 一 个 2 + 一 个 1 = "12" + "11" = "1211"

提示:

  • 1 <= n <= 30

🧂算法原理

这个题目蛮长,就是每一项都是对前一项的解释,那就是用代码来模拟这个过程,然后借用双指针leftright,让right右移,如果和s[left] == s[right],那么right继续右移,当right停的时候,right - left就是中间相同元素的个数。

所以本次的解法就是模拟+双指针

🧈代码实现

class Solution {
public:string countAndSay(int n){string ans = "1";while(--n)  //要翻译n-1次{string tmp;int len = ans.size();for(int left = 0,right = 0; right < len; ){while(right < len && ans[left] == ans[right])   right++;tmp+=to_string(right - left) + ans[left];left = right;}ans = tmp;}  return ans;    }
};

运行结果:

image-20231130221813853

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

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

相关文章

VUE2+THREE.JS辉光设定和解决辉光导致背景变暗的问题

THREE.JS辉光设定和解决辉光导致背景变暗的问题 THREE.JS 辉光设定THREE.JS 辉光导致背景变暗的问题1.设定背景图片2.初始化辉光3. animate 一直渲染辉光 THREE.JS 辉光设定 给我的设计好的fbx模型,已经设定好了模型发光材质,所以直接添加辉光效果,就可以自动发光 blender模型生…

经典策略梯度算法

经典策略梯度算法 DDPG算法 DDPG 算法被提出的初衷其实是 DQN 算法的一个连续动作空间版本扩展。深度确定性策略梯度算法&#xff08; deep deterministic policy gradient&#xff0c;DDPG&#xff09;&#xff0c;是一种确定性的策略梯度算法。 由于DQN算法中动作是通过贪…

pythonselenium自动化测试实战项目

说明&#xff1a;本项目采用流程控制思想&#xff0c;未引用unittest&pytest等单元测试框架 一.项目介绍 目的 测试某官方网站登录功能模块可以正常使用 用例 1.输入格式正确的用户名和正确的密码&#xff0c;验证是否登录成功&#xff1b; 2.输入格式正确的用户名和不…

【vue实战项目】通用管理系统:信息列表,信息录入

本文为博主的vue实战小项目系列中的第六篇&#xff0c;很适合后端或者才入门的小伙伴看&#xff0c;一个前端项目从0到1的保姆级教学。前面的内容&#xff1a; 【vue实战项目】通用管理系统&#xff1a;登录页-CSDN博客 【vue实战项目】通用管理系统&#xff1a;封装token操作…

使用 kubeadm 部署 Kubernetes 集群(一)linux环境准备

一、 初始化集群环境 准备三台 rocky8.8 操作系统的 linux 机器。每台机器配置&#xff1a;4VCPU/4G 内存/60G 硬盘 环境说明&#xff1a; IP 主机名 角色 内存 cpu 192.168.1.63 xuegod63 master 4G 4vCPU 192.168.1.64 xuegod64 worker 4G 4vCPU 192.168.1.62 xuegod62 work…

【【带Micro Blaze的 AXI GPIO 控制LED实验】】

带Micro Blaze的 AXI GPIO 控制LED实验 AXI GPIO IP 核为 AXI 接口提供了一个通用的输入/输出接口。AXI GPIO 是一个软核&#xff08;Soft IP&#xff09;&#xff0c;是由用户通过配置芯片的逻辑资源来实现的一个功能模块。 实验任务 &#xff1a; 本章的实验任务是通过调用…

JavaScript中数据类型的转换

前端面试大全JavaScript中数据类型的转换 &#x1f31f;经典真题 &#x1f31f;数据类型转换介绍 &#x1f31f;强制转换&#xff08;显式转换&#xff09; Number( ) String( ) Boolean( ) &#x1f31f;自动转换&#xff08;隐式转换&#xff09; 自动转换为布尔值 …

Java 的第二十章:多线程

创建线程 继承Thread 类 Thread 类时 java.lang 包中的一个类&#xff0c;从类中实例化的对象代表线程&#xff0c;程序员启动一个新线程需要建立 Thread 实例。 Thread 对象需要一个任务来执行&#xff0c;任务是指线程在启动时执行的工作&#xff0c;start() 方法启动线程&am…

koa2项目中封装log4js日志输出

1.日志输出到控制台 npm i log4js -D 封装log4js文件&#xff1a; 注意&#xff1a;每次都要重新获取log4js.getLogger(debug)级别才能生效 const log4js require("log4js");const levels {trace: log4js.levels.TRACE,debug: log4js.levels.DEBUG,info: log4js.…

CSS 在性能优化方面的实践

前言 CSS&#xff08;层叠样式表&#xff09;是一种用于描述网页外观和格式的语言。随着网页变得越来越复杂&#xff0c;CSS文件的大小也随之增加&#xff0c;这可能会对网页性能产生负面 .box {width: 100px;height: 100px;transition: transform 0.3s; }.box:hover {transf…

MySQL之binlog日志

聊聊BINLOG binlog记录什么&#xff1f; MySQL server中所有的搜索引擎发生了更新&#xff08;DDL和DML&#xff09;都会产生binlog日志&#xff0c;记录的是语句的原始逻辑 为什么需要binlog&#xff1f; binlog主要有两个应用场景&#xff0c;一是数据复制&#xff0c;在…

IPv6+2.0网络切片技术在电子政务网的应用实践详解

IPv6是面向5G、云网/算网融合的智能IP技术&#xff0c;具有包含可编程路径、快速业务发放、自动化运维、质量可视化、SLA保障和应用感知等特点。IPv6将万物互联提升到了万物智联&#xff0c;赋能百行百业高质量数字化转型。 图示&#xff1a;“IPv6”技术创新体系发展的三个阶段…