牛客NC199 字符串解码【中等 递归,栈的思想 C++/Java/Go/PHP】

ops/2025/1/16 0:07:06/

题目

在这里插入图片描述
题目链接:
https://www.nowcoder.com/practice/4e008fd863bb4681b54fb438bb859b92
相同题目:
https://www.lintcode.com/problem/575

思路

解法和基础计算器1,2,3类似,递归

参考答案C++

struct Info {string str;int stopindex;Info(string e, int c) : str(e), stopindex(c) {}
};class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param s string字符串* @return string字符串*/string decodeString(string s) {//解法和基础计算器1,2,3类似,递归return process(s, 0).str;}Info process(string s, int idx) {string str;int cur = 0;while (idx < s.size() && s[idx] != ']') {char c = s[idx];if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {str += c;idx++;} else if (c >= '0' && c <= '9') {cur = cur * 10 + int(c - '0');idx++;} else { //遇到[  需要递归获取[...] 的结果Info info = process(s, idx + 1);str += getStr(info.str, cur);cur = 0;idx = info.stopindex + 1;}}return Info(str, idx);}string getStr(string s1, int count) {string ans;for (int i = 0; i < count; i++) {ans += s1;}return ans;}
};

参考答案Java

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param s string字符串* @return string字符串*/public String decodeString (String s) {//解法和基础计算器1,2,3类似,递归return process(s, 0).ans;}public Info process(String s, int i) {StringBuilder ans = new StringBuilder();int cur = 0;while (i < s.length() && s.charAt(i) != ']') {char c = s.charAt(i);if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {ans.append(c);i++;} else if (c >= '0' && c <= '9') {cur = cur * 10 + c - '0';i++;} else { //遇到[Info next = process(s, i + 1);ans.append(getStr(next.ans, cur));cur = 0;i = next.stopIndex + 1;}}return new Info(ans.toString(), i);}public String getStr(String str, int count) {StringBuilder sb = new StringBuilder();for (int i = 0; i < count ; i++) {sb.append(str);}return sb.toString();}static class Info {String ans;int stopIndex;public Info(String s, int e) {ans = s;stopIndex = e;}}
}

参考答案Go

package mainimport "bytes"/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param s string字符串* @return string字符串*/
func decodeString(s string) string {//本答案和解答基础计算器1,2,3的思路类似//递归。遇到字母,遇到数字,遇到[  三种情况return process(s, 0).str
}func process(s string, idx int) Info {var buf bytes.Buffercur := 0for idx < len(s) && s[idx] != ']' {c := s[idx]if (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') {buf.WriteString(string(c))idx++} else if c >= '0' && c <= '9' {cur = cur*10 + int(c-'0')idx++} else { //遇到[  递归去吧,我需要递归的结果info := process(s, idx+1)buf.WriteString(getStr(info.str, cur))cur = 0idx = info.stopindex + 1}}return Info{buf.String(), idx}
}func getStr(str string, count int) string {var buf bytes.Bufferfor i := 0; i < count; i++ {buf.WriteString(str)}return buf.String()
}type Info struct {str       stringstopindex int
}

参考答案PHP

<?php/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param s string字符串 * @return string字符串*/
function decodeString( $s )
{//本答案和解答基础计算器1,2,3的思路类似//递归。遇到字母,遇到数字,遇到[  三种情况return process($s,0)->str;
}function process($s,$idx) {$str ='';$cur=0;while ($idx <strlen($s) && $s[$idx] !=']') {$c = $s[$idx];if(($c>='a' && $c<='z') ||($c>='A' && $c <='Z')){$str.=$c;$idx++;}else if($c>='0' && $c<='9'){$cur =$cur*10+intval($c-'0');$idx++;}else{ //遇到[ 了,递归获取[...] 中等的结果$info = process($s,$idx+1);$str.=(getStr($info->str,$cur));$cur =0;$idx = $info->stopindex+1;}}return new Info($str,$idx);
}function getStr($s,$count){$str = '';for($i=0;$i<$count;$i++){$str.=$s;}return $str;
}class Info{public $str;public $stopindex;public function __construct($a,$b){$this->str = $a;$this->stopindex = $b;}
}

http://www.ppmy.cn/ops/16511.html

相关文章

4.25日学习记录

[HZNUCTF 2023 preliminary]ppppop 对于php反序列化&#xff0c;在之前的学习中有过了解&#xff0c;但是对于序列化字符串的格式不是很了解&#xff0c;刚好接触这题&#xff0c;可以了解一下 序列化字符串的格式&#xff1a; 布尔型&#xff08;bool&#xff09;b&#xf…

计算机毕业设计Flask+Vue.js知识图谱音乐推荐系统 音乐爬虫可视化 音乐数据分析 大数据毕设 大数据毕业设计 机器学习 深度学习 人工智能

开发技术 协同过滤算法、机器学习、LSTM、vue.js、echarts、django、Python、MySQL 创新点 协同过滤推荐算法、爬虫、数据可视化、LSTM情感分析、短信、身份证识别 补充说明 适合大数据毕业设计、数据分析、爬虫类计算机毕业设计 介绍 音乐数据的爬取&#xff1a;爬取歌曲、歌手…

【go零基础】go-zero从零基础学习到实战教程 - 2项目初始化

到项目初始化过程了&#xff0c;这边的项目设计完全按照作者自己的喜好来进行定义和设置的&#xff0c;所以各位完全可以按照自己的偏好自喜设置哈。 首先是创建一个工作文件夹哈。 别问为啥不直接quickstart&#xff0c;因为quickstart生成的api名字是greet&#xff0c;改起来…

Git操作与异常处理

文章目录 常用操作1、代码拉取2、代码提交3、暂存区状态4、提交代码5、推送远程仓库 异常处理【1】报错信息&#xff1a;Cannot pull into a repository with state: MERGING【2】报错信息&#xff1a;You have not concluded your merge (MERGE_HEAD exists)【3】报错信息&…

uniapp对uni.request()的封装以及使用

官方文档 uni.request(OBJECT) | uni-app官网 (dcloud.net.cn) uni.request参数 参数名说明url是写api地址的data是用来传值的对于 GET 方法&#xff0c;会将数据 转换为 query string。例如 { name: name, age: 18 } 转换后的结果是 namename&age18。对于 POST 方法且 …

每天学习一个Linux命令之awk

每天学习一个Linux命令之awk 在Linux系统中&#xff0c;awk是一个功能强大的命令行工具&#xff0c;用于文本处理和数据提取。它可以读取文本文件的每一行&#xff0c;根据指定的模式进行匹配&#xff0c;并对满足条件的行进行处理和操作。本文将介绍awk命令的用法和常用选项。…

Java集合框架-Collection-List-vector(遗留类)

目录 一、vector层次结构图二、概述三、底层数据结构四、常用方法五、和ArrayList的对比 一、vector层次结构图 二、概述 Vector类是单列集合List接口的一个实现类。与ArrayList类似&#xff0c;Vector也实现了一个可以动态修改的数组&#xff0c;两者最本质的区别在于——Vec…

39 vue.js

1.1 vue是什么&#xff1f; vue是当下主流的前端框架&#xff0c;用于构建用户界面的 渐进式 自底向上增量开发的MVVM框架。 渐进式&#xff1a;其实每个框架都有自己的特点&#xff0c;在开发的过程中&#xff0c;可以在原有的系统上&#xff0c;把其中一两个功能用VUE…