【LeetCode】字符串与栈的练习

news2024/12/23 13:57:39
  1. 字符串相乘
    在这里插入图片描述
class Solution 
{
public:
	/*
	* 将两个字符串相乘拆分成两步:
	* 先将一个字符串的每个字符与另一个字符串相乘得到一个计算结果
	* 再将所有计算结果的字符串进行相加
	*/
    string multiply(string num1, string num2) 
    {
        string result = "0";
        // 一个字符串为'0'串,结果就为0
        if(num1 == "0" || num2 == "0")
        {
            return result;
        }
		
		// 计算顺序从右向左,就像乘法计算中的从低位向高位的顺序
        for(size_t i = num1.size(); i > 0; --i)
        {
        	// 字符与字符串相乘
            string tmp = subMultiply(num1[i - 1], num2, num1.size() - i);
            // 字符串相加
            result = addStrings(result, tmp);
        }
        return result;
    }
    // 字符与字符串相乘的计算. n表示的是计算结果串需要补几个0
    string subMultiply(char c, string num, size_t n)
    {
        int carry = 0;
        int mul = 0;
        for(size_t i = num.size(); i > 0; --i)
        {
            mul = (c - '0') * (num[i - 1] - '0') + carry;
            carry = mul / 10;
            num[i - 1] = ((mul % 10) + '0');
        }
        if(carry != 0)
        {
            num.insert(0, 1, carry + '0');
        }
        while(n--)
        {
            num += '0';
        }
        return num;
    }
	// 两个字符串相加的计算
    string addStrings(string num1, string num2)
    {
        size_t index1 = num1.size() - 1;
        size_t index2 = num2.size() - 1;
        
        string result;
        int sum = 0;
        int carry = 0;
        while(index1 != -1 && index2 != -1)
        {
            sum = num1[index1--] - '0' + num2[index2--] - '0' + carry;
            result += ((sum % 10) + '0');
            carry = sum / 10;
        }

        while(index1 != -1)
        {
            sum = num1[index1--] - '0' + carry;
            result += ((sum % 10) + '0');
            carry = sum / 10;
        }

        while(index2 != -1)
        {
            sum = num2[index2--] - '0' + carry;
            result += ((sum % 10) + '0');
            carry = sum / 10;
        }

        if(carry != 0)
        {
            result += (carry + '0');
        }

        reverse(result.begin(), result.end());
        return result;
    }
};
  1. 电话号码的字母组合
    在这里插入图片描述
const static vector<string> num2str = { "","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" };
class Solution
{
public:
    void recursion(string::iterator itBegin, string::iterator itEnd, vector<string>& ret, string& str)
    {
        string newStr = str; // 用一个新的字符串保存str的原始数据,防止丢失
        if (itBegin != itEnd)
        {
            size_t n = *itBegin - '0';
            for (size_t i = 0; i < num2str[n].size(); ++i)
            {
                str = newStr; // 保证每次循环都是原始数据
                str += num2str[n][i];
                recursion(itBegin + 1, itEnd, ret, str);
            }
        }
        else
        {
            ret.push_back(str);
        }
    }
    vector<string> letterCombinations(string digits)
    {
        vector<string> ret;
        // digits.size() == 0 直接跳出结束
        if (digits.begin() != digits.end())
        {
      		// 获取第1个digit
            string::iterator pc = digits.begin();
            // 计算下标,和字符串对应
            size_t n = (*pc) - '0';
            // 遍历字符串,同时递归
            for (size_t i = 0; i < num2str[n].size(); ++i)
            {
                string str; // 每次循环,str都会清空
                str += num2str[n][i];
                recursion(digits.begin() + 1, digits.end(), ret, str);
            }
        }

        return ret;
    }
};
  1. 最小栈
    在这里插入图片描述
class MinCount
{
public:
	// 存最小值及其计数
    MinCount(int min, int count = 1)
        : _min(min)
        , _count(count)
    {}
public:
    int _min;
    int _count;
};

class MinStack
{
public:
    void push(int val)
    {
        _st.push(val);
        // 新的最小值被push
        if (_minst.empty() || val < _minst.top()._min)
        {
            _minst.push(MinCount(val));
        }
        // 最小值不变,计数+1
        else if (val == _minst.top()._min)
        {
            ++(_minst.top()._count);
        }
    }

    void pop()
    {
    	// 被pop的值如果是最小值进入判断
        if (_st.top() == _minst.top()._min)
        {
            if (_minst.top()._count > 1)
            {
                --(_minst.top()._count);
            }
            else
            {
                _minst.pop();
            }
        }
        
        _st.pop();
    }

    int top()
    {
        return _st.top();
    }

    int getMin()
    {
        return _minst.top()._min;
    }
private:
    stack<int> _st;
    stack<MinCount> _minst;
};
  1. 栈的压入、弹出序列
    在这里插入图片描述
#include <stack>
class Solution 
{
public:
    bool IsPopOrder(vector<int>& pushV, vector<int>& popV) 
    {
        size_t pushI = 0;
        size_t popI = 0;
        stack<int> st;
        while(pushI < pushV.size())
        {
            if(pushV[pushI] != popV[popI])
            {
                st.push(pushV[pushI]);
            }
            else 
            {
                ++popI;
                while(!st.empty() && st.top() == popV[popI])
                {
                    st.pop();
                    ++popI;
                }
            }
            ++pushI;
        }
        
        return st.empty();
    }
};
  1. 逆波兰表达式求值
    在这里插入图片描述
class Solution 
{
public:
    int evalRPN(vector<string>& tokens) 
    {
        int num1 = 0;
        int num2 = 0;
        stack<int> st;

        for(string& s : tokens)
        {
            if(s == "+")
            {
                num2 = st.top();
                st.pop();
                num1 = st.top();
                st.pop();
                st.push(num1 + num2);
            }
            else if(s == "-")
            {
                num2 = st.top();
                st.pop();
                num1 = st.top();
                st.pop();
                st.push(num1 - num2);
            }
            else if(s == "*")
            {
                num2 = st.top();
                st.pop();
                num1 = st.top();
                st.pop();
                st.push(num1 * num2);
            }
            else if(s == "/")
            {
                num2 = st.top();
                st.pop();
                num1 = st.top();
                st.pop();
                st.push(num1 / num2);
            }
            else
            {
                st.push(stoi(s));
            }
        }
        return st.top();
    }
};
  1. 数组中的第K个最大元素
    在这里插入图片描述
class Solution 
{
public:
    int findKthLargest(vector<int>& nums, int k) 
    {
    	// 向下建堆时间复杂度O(logN)
        priority_queue<int> pq(nums.begin(), nums.end());
        while(--k)
        {
            pq.pop();
        }
        return pq.top();
    }
};

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

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

相关文章

微服务——es数据聚合+RestClient实现聚合

数据聚合 聚合的种类 DSL实现Bucket聚合 如图所示&#xff0c;设置了10个桶&#xff0c;那么就显示了数量最多的前10个桶&#xff0c;品牌含有7天酒店的有30家&#xff0c; 品牌含有如家的也有30家。 修改排序规则 限定聚合范围 DSL实现Metrics聚合 如下案例要求对不同的品…

录像模糊变高清:提高录制视频清晰度的方法

录像是记录生活点滴的重要方式之一&#xff0c;然而&#xff0c;由于种种原因&#xff0c;我们可能会遇到一些模糊、不清晰的视频。为了解决这一问题&#xff0c;今天来给大家分享一下如何利用牛学长视频修复工具修复录像视频清晰度的方法&#xff0c;方便快捷&#xff0c;无需…

springBoot集成caffeine,自定义缓存配置 CacheManager

目录 springboot集成caffeine Maven依赖 配置信息&#xff1a;properties文件 config配置 使用案例 Caffeine定制化配置多个cachemanager springboot集成redis并且定制化配置cachemanager springboot集成caffeine Caffeine是一种基于服务器内存的缓存库。它将数据存储在…

批量查询快递信息的最佳解决方案

快递查询是我们日常生活中经常需要进行的操作&#xff0c;然而&#xff0c;当我们有多个快递单号需要查询时&#xff0c;逐个查询就显得非常繁琐和耗时。为了解决这个问题&#xff0c;今天给大家推荐一款实用的软件——【固乔快递查询助手】。 首先&#xff0c;在浏览器中搜索并…

Activity启动过程详解(Android 12源码分析)

Activity的启动方式 启动一个Activity&#xff0c;通常有两种情况&#xff0c;一种是在应用内部启动Activity&#xff0c;另一种是Launcher启动 1、应用内启动 通过startActivity来启动Activity 启动流程&#xff1a; 一、Activity启动的发起 二、Activity的管理——ATMS 三、…

Mysql根据创建时间表分区实践

背景 最近订单表遇到大数据量的问题&#xff0c;并且表中随着时间的积累会变得更大&#xff0c;当数据量较大时&#xff0c;存储的物理文件会变得非常大、使用性能很差。 我们用的是GaussDB。为了提高查询效率&#xff0c;建议表大于500w进行分区&#xff0c;所以在规划阶段我…

opencv基础47 查找图像轮廓cv2.findContours()详解

什么是图像轮廓&#xff1f; 图像轮廓是指图像中物体边缘的连续性曲线。在计算机视觉和图像处理中&#xff0c;轮廓通常被用于检测物体、分割图像以及提取物体特征。 图像轮廓是由一系列连续的像素点组成&#xff0c;这些像素点位于物体边界上。轮廓的特点是在物体和背景之间的…

springboot生成表结构和表数据sql

需求 业务背景是需要某单机程序需要把正在进行的任务导出&#xff0c;然后另一台电脑上单机继续运行&#xff0c;我这里选择的方案是同步SQL形式&#xff0c;并保证ID随机&#xff0c;多个数据库不会重复。 实现 package com.nari.web.controller.demo.controller;import cn…

Android 11 获取启动其他应用

Android 11 获取启动其他应用 本文代码地址 https://gitee.com/chenjim/QueryAppInfo 最新更新地址 https://gitee.com/chenjim/chenjimblog 前言 如果应用以 Android 11&#xff08;API 级别 30&#xff09;或更高版本为目标平台&#xff0c;并查询与设备上已安装的其他应用相…

Python 面试必知必会(一):数据结构

《Python Cookbook》的作者David Beazley的课程PPT开源了&#xff0c;目标用户是希望从编写基础脚本过渡到编写更复杂程序的高级 Python 程序员&#xff0c;课程主题侧重于流行库和框架中使用的编程技术&#xff0c;主要目的是更好地理解 Python 语言本身&#xff0c;以便阅读他…

简易图书管理系统(面向对象思想)

目录 前言 1.整体思路 2.Book包 2.1Book类 2.2BookList类 3.user包 3.1User类 3.2NormalUser类 3.3AdminUser类 4.operation 4.1IOPeration接口 4.2ExitOperation类 4.3FindOperation类 4.4ShowOperation类 4.5AddOperation类 4.6DelOperation类 4.7BorrowOpera…

下半年提速拓店,为什么说屈臣氏引领美妆零售的未来?

屈臣氏过去是美妆零售的先锋&#xff0c;目前来看它或许仍然是先锋。 杰弗里摩尔在《公司进化论》中总结提出&#xff0c;自由市场经济运作的方式&#xff0c;遵循着一些类似自然界有机系统的定律&#xff1a;通俗来说&#xff0c;资源竞争带来“刺激创新”——由消费者偏好形…

看重ARM?苹果、三星、英伟达等知名企业纷纷表示加大投资

根据日经亚洲的报道&#xff0c;芯片设计公司Arm计划进行首次公开募股并在纳斯达克上市。苹果、三星电子、英伟达、英特尔等知名企业计划在Arm美股上市后投资该公司。 据悉&#xff0c;Arm将于9月份上市&#xff0c;预计估值将达到至少600亿美元&#xff08;约合4314亿元人民币…

【PyQt5+matplotlib】获取鼠标在canvas上的点击坐标

示例代码&#xff1a; import sys import matplotlib.pyplot as plt from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvasclass MyMainWindow(QMainWindow):de…

vulnhub靶场-y0usef笔记

vulnhub靶场-y0usef笔记 信息收集 首先fscan找到目标机器ip http://192.168.167.70/ nmap扫描端口 Host is up (0.00029s latency). Not shown: 998 closed tcp ports (reset) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.13 (Ub…

(十五)大数据实战——hive的安装部署

前言 Hive是由Facebook开源&#xff0c;基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供类SQL查询功能。本节内容我们主要介绍一下hive的安装与部署的相关内容。 正文 上传hive安装包到hadoop101服务器/opt/software目录 解…

Reinforcement Learning with Code (对比Monte-Carlo与TD算法)【Code 3. MonteCarlo】

Reinforcement Learning with Code & &#xff08;对比Monte-Carlo与TD算法&#xff09;【Code 3. MonteCarlo】 This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced s…

成功搞定H7-TOO的FreeRTOS Trace图形化链表方式展示任务管理

之前推出了H7-TOOL的RTOS Trace功能&#xff0c;已经支持RTX5&#xff0c;ThreadX&#xff0c;uCOS-III&#xff0c;uCOS-II和FreeRTOS&#xff0c;特色是不需要目标板额外做任何代码&#xff0c;实时检测RTOS任务执行情况&#xff0c;支持在线和脱机玩法&#xff0c;效果是下面…

网络编程——字节序和地址转换

字节序和地址转换 一、字节序 1、字节序概念 是指多字节数据的存储顺序,数据在内存中存储的方式 2、分类 大端序(网络字节序)&#xff1a;高位的数据存放在低地址位 arm架构、交换机、路由器 小端序(主机字节序)&#xff1a;高位的数据存放在高地址位 x86架构计算机 注意 …

10_Vue3 其它的组合式API(Composition API)

Vue3 中的其它组合式API 1.shallowReactive 与 shallowRef 2. readonly 与 shallowReadonly 3.toRaw 与 markRaw 4.customRef 5.provide 与 inject 6.响应式数据的判断