【优选算法】(第三十四篇)

news2024/10/17 9:53:25

目录

基本计算器II(medium)

题目解析

讲解算法原理

编写代码

字符串解码(medium)

题目解析

讲解算法原理

编写代码


基本计算器II(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给你⼀个字符串表达式s,请你实现⼀个基本计算器来计算并返回它的值。整数除法仅保留整数部分。
你可以假设给定的表达式总是有效的。所有中间结果将在[-2^31,2^31-1]的范围内。注意:不允许使⽤任何将字符串作为数学表达式计算的内置函数,⽐如eval()。
⽰例1:
输⼊:s="3+2*2"输出:7
⽰例2:
输⼊:s="3/2"输出:1
⽰例3:
输⼊:s="3+5/2"输出:5
提⽰:• 1<=s.length<=3*10^5• s由整数和算符('+','-','*','/')组成,中间由⼀些空格隔开• s表⽰⼀个有效表达式
• 表达式中的所有整数都是⾮负整数,且在范围[0,2^31-1]内• 题⽬数据保证答案是⼀个32-bit整数

题⽬解析:

⼀定要认真看题⽬的提⽰,从提⽰中我们可以看到这道题:• 只有「加减乘除」四个运算;
• 没有括号;
• 并且每⼀个数都是⼤于等于 0 的;
这样可以⼤⼤的「减少」我们需要处理的情况。 

讲解算法原理

解法(栈):
算法思路:

由于表达式⾥⾯没有括号,因此我们只⽤处理「加减乘除」混合运算即可。根据四则运算的顺序,我们可以先计算乘除法,然后再计算加减法。由此,我们可以得出下⾯的结论:
• 当⼀个数前⾯是 '+' 号的时候,这⼀个数是否会被⽴即计算是「不确定」的,因此我们可以先压
⼊栈中;
• 当⼀个数前⾯是 '-' 号的时候,这⼀个数是否被⽴即计算也是「不确定」的,但是这个数已经
和前⾯的-号绑定了,因此我们可以将这个数的相反数压⼊栈中;
• 当⼀个数前⾯是 '*' 号的时候,这⼀个数可以⽴即与前⾯的⼀个数相乘,此时我们让将栈顶的元
素乘上这个数;
• 当⼀个数前⾯是 '/' 号的时候,这⼀个数也是可以⽴即被计算的,因此我们让栈顶元素除以这个
数。
当遍历完全部的表达式的时候,栈中剩余的「元素之和」就是最终结果。

编写代码

c++算法代码:

class Solution
{
public:
 int calculate(string s) 
 {
 vector<int> st; // ⽤数组来模拟栈结构
 int i = 0, n = s.size();
 char op = '+';
 while(i < n)
 {
 if(s[i] == ' ') i++;
 else if(s[i] >= '0' && s[i] <= '9')
 {
 // 先把这个数字给提取出来
 int tmp = 0;
 while(i < n && s[i] >= '0' && s[i] <= '9') 
 tmp = tmp * 10 + (s[i++] - '0');
 if(op == '+') st.push_back(tmp);
 else if(op == '-') st.push_back(-tmp);
 else if(op == '*') st.back() *= tmp;
 else st.back() /= tmp;
 }
 else
 {
 op = s[i];
 i++;
 }
 }
 int ret = 0;
 for(auto x : st) ret += x;
 return ret;
 }
};

java算法代码:

class Solution
{
 public int calculate(String _s) 
 {
 Deque<Integer> st = new ArrayDeque<>();
 char op = '+';
 int i = 0, n = _s.length();
 char[] s = _s.toCharArray();
 while(i < n)
 {
 if(s[i] == ' ') i++;
 else if(s[i] >= '0' && s[i] <= '9')
 {
 int tmp = 0;
 while(i < n && s[i] >= '0' && s[i] <= '9')
 {
 tmp = tmp * 10 + (s[i] - '0');
 i++;
 }
 if(op == '+') st.push(tmp);
 else if(op == '-') st.push(-tmp);
 else if(op == '*') st.push(st.pop() * tmp);
 else st.push(st.pop() / tmp);
 }
 else
 {
 op = s[i];
 i++;
 }
 }
 // 统计结果
 int ret = 0;
 while(!st.isEmpty())
 {
 ret += st.pop();
 }
 return ret;
 }
}

字符串解码(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给定⼀个经过编码的字符串,返回它解码后的字符串。
编码规则为:k[encoded_string],表⽰其中⽅括号内部的encoded_string正好重复k次。注意k保证为正整数。
你可以认为输⼊字符串总是有效的;输⼊字符串中没有额外的空格,且输⼊的⽅括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表⽰重复的次数k,例如不会出现像3a或2[4]的输⼊。
⽰例1:
输⼊:s="3[a]2[bc]"
输出:"aaabcbc"
⽰例2:
输⼊:s="3[a2[c]]"
输出:"accaccacc"
⽰例3:
输⼊:s="2[abc]3[cd]ef"
输出:"abcabccdcdcdef"

讲解算法原理

解法(两个栈):
算法思路:

对于 3[ab2[cd]] ,我们需要先解码内部的,再解码外部(为了⽅便区分,使⽤了空格):• 3[ab2[cd]] -> 3[abcd cd] -> abcdcd abcdcd abcdcd
在解码 cd 的时候,我们需要保存 3 ab 2 这些元素的信息,并且这些信息使⽤的顺序是从后往前,正好符合栈的结构,因此我们可以定义两个栈结构,⼀个⽤来保存解码前的重复次数 k (左括号前的数字),⼀个⽤来保存解码之前字符串的信息(左括号前的字符串信息)。

编写代码

c++算法代码:

class Solution
{
public:
 string decodeString(string s) 
 {
 stack<int> nums;
 stack<string> st;
 st.push("");
 int i = 0, n = s.size();
 while(i < n)
 {
 if(s[i] >= '0' && s[i] <= '9')
 {
 int tmp = 0;
 while(s[i] >= '0' && s[i] <= '9')
 {
 tmp = tmp * 10 + (s[i] - '0');
 i++;
 }
 nums.push(tmp);
 }
 else if(s[i] == '[')
 {
 i++; // 把括号后⾯的字符串提取出来
 string tmp = "";
 while(s[i] >= 'a' && s[i] <= 'z')
 {
 tmp += s[i];
 i++;
 }
 st.push(tmp);
 }
 else if(s[i] == ']')
 {
 string tmp = st.top();
 st.pop();
 int k = nums.top();
 nums.pop();
 while(k--)
 {
 st.top() += tmp;
 }
 i++; // 跳过这个右括号
 }
 else
 {
 string tmp;
 while(i < n && s[i] >= 'a' && s[i] <= 'z')
 {
 tmp += s[i];
 i++;
 }
 st.top() += tmp;
 }
 }
 return st.top();
 }
};

java算法代码:

class Solution
{
 public String decodeString(String _s) 
 {
 Stack<StringBuffer> st = new Stack<>();
 st.push(new StringBuffer()); // 先放⼀个空串进去 Stack<Integer> nums = new Stack<>();
 int i = 0, n = _s.length();
 char[] s = _s.toCharArray();
 while(i < n)
 {
 if(s[i] >= '0' && s[i] <= '9')
 {
 int tmp = 0;
 while(i < n && s[i] >= '0' && s[i] <= '9')
 {
 tmp = tmp * 10 + (s[i] - '0');
 i++;
 }
 nums.push(tmp);
 }
 else if(s[i] == '[')
 {
 i++; // 把后⾯的字符串提取出来
 StringBuffer tmp = new StringBuffer();
 while(i < n && s[i] >= 'a' && s[i] <= 'z')
 {
 tmp.append(s[i]);
 i++;
 }
 st.push(tmp);
 }
 else if(s[i] == ']')
 {
 // 解析
 StringBuffer tmp = st.pop();
 int k = nums.pop();
 while(k-- != 0)
 {
 st.peek().append(tmp);
 }
 i++;
 }
 else
 {
 StringBuffer tmp = new StringBuffer();
 while(i < n && s[i] >= 'a' && s[i] <= 'z')
 {
 tmp.append(s[i]);
 i++;
 }
 st.peek().append(tmp);
 }
 }
 return st.peek().toString();
 }
}

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

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

相关文章

jar 导入本地和远程私服 maven 仓库

jar 导入本地和远程私服 maven 仓库artemis-http-client 认证库 maven 坐标为&#xff1a; 执行 mvn 命令&#xff1a; mvn install:install-file -DfileD:\download\lib\artemis-http-client-1.1.12.RELEASE.jar -DgroupIdcom.hikvision.ga -DartifactIdartemis-http-clien…

图像中的融合

图像显示函数 def img_show(name, img):"""显示图片:param name: 窗口名字:param img: 图片对象:return: None"""cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()图像读取与处理 读取图片 cloud cv2.imread(bg.jpg) fish cv2.…

C++ | Leetcode C++题解之第485题最大连续1的个数

题目&#xff1a; 题解&#xff1a; class Solution { public:int findMaxConsecutiveOnes(vector<int>& nums) {int maxCount 0, count 0;int n nums.size();for (int i 0; i < n; i) {if (nums[i] 1) {count;} else {maxCount max(maxCount, count);coun…

【二刷hot-100】day1

目录 1.两数之和 2.字母异位词分组 3.字母异位词分组 4.最长连续序列 5.移动零 6.盛最多水的容器 7.三数之和 8.接雨水 1.两数之和 class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer,Integer> mapnew HashMap<>();for (int i0;i<…

10.16标准IO

1、完成标准IO的单字符、字符串、格式化、模块化实现两个文件的拷贝&#xff1b; 单字符实现 #include <myhead.h> int main(int argc, const char *argv[]) {//使用单字符完成两个文件拷贝FILE *fp_srcfopen(argv[1],"r");FILE *fp_destfopen(argv[2],"…

猪圈密码简单实例

猪圈密码简单实例 猪圈密码表 根据上面的密码表&#xff0c;得到每个字母所对应的符号如下 例如单词the的加密结果为&#xff1a;

IO编程--单字符、字符串、格式化、模块化实现文件拷贝以及登录注册

一、完成标准io的单字符、字符串、格式化、模块化实现两个文件的拷贝 代码如下&#xff1a; 1.单字符 #include <myhead.h> int main(int argc, const char *argv[]) {//打开文件FILE* fpfopen("test.txt","r"); FILE* fqfopen("copy_test.txt&…

leetcode:744. 寻找比目标字母大的最小字母(python3解法)

难度&#xff1a;简单 给你一个字符数组 letters&#xff0c;该数组按非递减顺序排序&#xff0c;以及一个字符 target。letters 里至少有两个不同的字符。 返回 letters 中大于 target 的最小的字符。如果不存在这样的字符&#xff0c;则返回 letters 的第一个字符。 示例 1&a…

2024国际潜水小姐大赛中国区总决赛盛典在广州举行,吉林选手张潇文获冠军!

传承“以美之名&#xff0c;保护海洋”的精神&#xff0c;2024年10月15日晚&#xff0c;2024国际潜水小姐大赛中国区总决赛盛典在广州渔民新村隆重举行&#xff01;来自全国多个城市&#xff0c;经过层层选拔产生的20位佳丽齐聚广州&#xff0c;以独特的女性水下之美和健康美&a…

初识算法 · 二分查找(1)

目录 前言&#xff1a; 二分查找 题目解析 算法原理 算法编写 搜索插入位置 题目解析 算法原理 算法编写 前言&#xff1a; 本文呢&#xff0c;我们从滑动窗口窗口算法移步到了二分查找算法&#xff0c;我们简单了解一下二分查找算法&#xff0c;二分查找算法是一个十…

安科瑞末端组合式智慧用电装置在高校宿舍中的应用

1相关背景 学校宿舍用电隐患 安全用电历来都是学校安全工作的一个重点&#xff0c;然而每年因此发生的人身伤害以及火灾事故却在继续&#xff0c;究其原因&#xff0c;主观上是我们的防患意识淡薄&#xff0c;客观上则是由于学生在宿舍使用违规电器、乱拉电线造成的。 现代的…

Java IO 基础知识

IO 流简介 IO 即 Input/Output&#xff0c;输入和输出。数据输入到计算机内存的过程即输入&#xff0c;反之输出到外部存储&#xff08;比如数据库&#xff0c;文件&#xff0c;远程主机&#xff09;的过程即输出。数据传输过程类似于水流&#xff0c;因此称为 IO 流。IO 流在…

java关于如何实现读取各种类型的文件核心属性方法,比如获取标题和作者、主题等;附带远程的https的地址文件读取方法;

有两种方法&#xff1a; 通过提供的现成api进行调用读取pdf文件&#xff0c;或doc、xlsx、pptx文件&#xff1b;可能商业需要付费 https://www.e-iceblue.cn/pdf_java_document_operation/set-pdf-document-properties-in-java.html Spire.PDF for Java import com.spire.pdf…

为什么SSH协议是安全的?

SSH的传输层协议&#xff08;Transport Layer Protocol&#xff09;和用户鉴权协议&#xff08;Authentication Protocol&#xff09;确保数据的传输安全&#xff0c;这里只介绍传输层协议&#xff0c;是SSH协议的基础。 本文针对SSH2协议。 1、客户端连接服务器 服务器默认…

基于springboot实习管理系统

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的&#xff0c;前后端分离。 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;…

k8s use-context是什么

kubectl 的 use-context 命令用于在 Kubernetes 集群中切换上下文&#xff08;context&#xff09;&#xff0c;从而方便地在多个集群或命名空间之间进行操作。一个上下文定义了 kubectl 使用的 集群、用户 和 命名空间 的组合。 use-context 的作用&#xff1a; 每个上下文&…

msql事务隔离级别 线上问题

1. 对应代码 解决方式&#xff1a; 在事务隔离级别为可重复读&#xff08;RR&#xff09;时&#xff0c;数据库确实通常会记录当前数据的快照。 在可重复读隔离级别下&#xff0c;事务在执行期间看到的数据是事务开始时的数据快照&#xff0c;即使其他事务对数据进行了修改&am…

考研前所学c语言02(2024/10/16)

1.一个十进制的数转化为二进制的就是不断除二取余&#xff0c;得到的余数从下到上取 比如123&#xff1a; 结果为&#xff1a; 同理其他的十进制转八进制&#xff0c;十六进制就除八&#xff0c;除十六即可 再比如123转十六进制&#xff1a; 因为余数是11&#xff0c;十六进…

超详细的finalshell安装数据库以及数据库的基本操作

一、下载 MySQL Enterprise Edition Downloads | Oraclehttps://www.oracle.com/mysql/technologies/mysql-enterprise-edition-downloads.html 这边有不同的版本&#xff0c;要看你的操作系统&#xff08;centos7 / centos8&#xff09;安装的是哪个版本 我把连接提取出来了&…

Vivado - Aurora 8B/10B IP

目录 1. 简介 2. 设计调试 2.1 Physical Layer 2.2 Link Layer 2.3 Receiver 2.4 IP 接口 2.5 调试过程 2.5.1 Block Design 2.5.2 释放 gt_reset 2.5.3 观察数据 3. 实用技巧 3.1 GT 坐标与布局 3.1.1 选择器件并进行RTL分析 3.1.2 进入平面设计 3.1.3 收发器布…