Leetcode之string

news2024/11/24 10:26:30

目录

  • 前言
  • 1. 字符串相加
  • 2. 仅仅反转字母
  • 3. 字符串中的第一个唯一字符
  • 4. 字符串最后一个单词的长度
  • 5. 验证回文串
  • 6. 反转字符串Ⅱ
  • 7. 反转字符串的单词Ⅲ
  • 8. 字符串相乘
  • 9. 打印日期

前言

本篇整理了一些关于string类题目的练习, 希望能够学以巩固.

博客主页: 酷酷学!!! 点击关注~


1. 字符串相加

在这里插入图片描述

题目思路:
本题为大数运算类型题目, 不能用于处理大整数的库, 但可以使用一般的算术运算, 我们进行模拟, 首先依次取出每个数字的最后一位,进行加法运算, 并且将值分为进位和数值, 第一次的进位next = 0 , 这里只有当num1和num2都结束才能结束循环, 例如下面999999999+1, 如果其中一个数字已经结束, 则在高位补0, 并且将每一次的值追加到答案字符串, 循环结束, 如果进位还有值, 也追加到结束字符串, 最后逆置字符串.

在这里插入图片描述

参考代码:

class Solution {
public:
    string addStrings(string num1, string num2) {
        int end1 = num1.size() - 1;
        int end2 = num2.size() - 1;
        string str;
        int next = 0;
        while (end1 >= 0 || end2 >= 0) {
            int x1 = end1 >= 0 ? num1[end1] - '0' : 0;
            int x2 = end2 >= 0 ? num2[end2] - '0' : 0;
            int x = x1 + x2 + next;

            next = x / 10;
            x = x % 10;

            str += (x + '0');
            end1--;
            end2--;
        }

        if (next == 1) {
            str += '1';
        }

        reverse(str.begin(), str.end());
        return str;
    }
};

2. 仅仅反转字母

在这里插入图片描述

题目思路:

首先题目要求仅仅反转字符, 字母包括大写字母和小写字母, 其余位置不动, 那么我们就需要先判断什么元素需要反转, 首先判断是否为字母, 定义双指针, 如果相遇则结束, 遇到字母开始进行位置交换, 之后进行下一轮交换.

参考代码:

class Solution {
public:

    bool isZm(char c)
    {
        if((c <= 'z'&& c>='a')||(c <= 'Z' && c>= 'A'))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    string reverseOnlyLetters(string s) {
        int begin = 0;
        int end = s.size() - 1;
        while(begin < end)
        {
            if(!isZm(s[begin]))
            {
                begin++;
            }
            if(!isZm(s[end]))
            {
                end--;
            }
            if(isZm(s[begin])&&isZm(s[end]))
            {
                char tmp = s[begin];
                s[begin] = s[end];
                s[end] = tmp;
                begin++;
                end--;
            }

        }
        return s;
    }
};


3. 字符串中的第一个唯一字符

在这里插入图片描述
题目思路:

首先题目给出了条件, 仅包含小写字母, 我们可以采用计数排序的思想, 将出现的字母次数记录下来, 之后重新遍历字符串, 然后找到第一次出现一次的字符串, 这里需要注意对应的下标.

参考代码:

class Solution {
public:
    int firstUniqChar(string s) {
        int count[26] = {0};
        for(int i = 0 ;i<s.size();i++)
        {
            count[s[i] - 'a']++;
        }

        for(int i = 0;i<s.size();i++)
        {
            if(count[s[i]-'a'] == 1)
            {
                return i;
            }
        }
        return -1;
    }
};

4. 字符串最后一个单词的长度

在这里插入图片描述

题目思路:

首先题目指出, 字符串以空格分隔, 并且不以空格结尾, 可以使用字符串的成员函数, 从后往前寻找, 找到空格的位置, 即为最后一个字符串的分割位置, 使用成员函数substr进行字符串分割, 从pos+1位置,不传第二个参数默认到字符串结尾, 随后输出字符串长度即可.

参考代码:

#include <iostream>
#include<string>
using namespace std;

int main() {
    string s;
    cin>>s;
    size_t pos = s.rfind(' ');
    string s2;
    s2 = s.substr(pos+1);
    cout<<s2.size()<<endl;
}


5. 验证回文串

在这里插入图片描述
题目思路:

首先题目中给出所需要判断回文的为大小写字母以及数字, 不区分大小写, 正反读都一样, 即为回文串, 那么我们可以直接先将大写字母转化为小写字母, 接着定义双指针, 从头尾遍历, 相遇结束, 如果是字母和数字则判断下标位置的字符是否相同, 如果相同即为回文.

参考代码:

class Solution {
public:
    bool isZm(char c)
    {
        if((c>='a'&&c<='z')||(c<='9'&&c>='0'))
        {
            return true;
        }
        return false;
    }
    bool isPalindrome(string s) {
        for(int i = 0 ; i < s.size() ; ++i)
        {
            if(s[i]<='Z'&&s[i]>='A')
            {
                s[i] += 32;
            }
        }
        int begin = 0;
        int end = s.size()-1;

        while(begin<end)
        {
            while(!isZm(s[begin]))
            {
                begin++;
            }
            while(!isZm(s[end]))
            {
                end--;
            }
            if(s[begin]==s[end])
            {
                begin++;
                end--;
            }
            else{
                return false;
            }

        }
        return true;
    }
};

6. 反转字符串Ⅱ

在这里插入图片描述
题目思路: 首先题目要求每2k个字符, 若这段区间少于k个字符, 则全部反转, 若大于或等于k个字符, 则反转前k个字符, 于是乎我们进行模拟实现, 首先将字符串划分为每次2k的小区间, 判断此区间如果不是字符串结尾则反转前k个, 若是字符串结尾, 则判断最后一个区间是否小于k个字符, 如果最后剩余的字符个数小于k, 则全部反转, 如果大于, 则反转前k个.

参考代码:

class Solution {
public:
    string reverseStr(string s, int k) {
        int size = s.size();//min()里面接受参数为变量
        for(int i = 0; i< s.size(); i+= 2*k)
        {
            reverse(s.begin()+i,s.begin()+min(i+k,size));
        }
        return s;
    }
};

7. 反转字符串的单词Ⅲ

在这里插入图片描述

题目思路:

本题没有良好的区间划分, 我们不能用上题的思路进行求解, 首先题目要求反转字符串的单词, 那我们需要找到每个单词, 遍历字符串, 找到字符串分割符, 然后取出单词的区间, 将字符依次进行交换, 完成反转, 控制i的位置并维护这段区间, 将单词进行反转.

参考代码:

class Solution {
public:
    string reverseWords(string s) {
        int i = 0;
        while(i<s.size())
        {
            int start = i;
            while(i<s.size() && s[i] != ' ')
            {
                i++;
            }
            int begin = start;
            int end = i - 1;
            while(begin < end)
            {
                swap(s[begin++] , s[end--]);
            }
            while(i < s.size() && s[i] == ' ')
            {
                i++;
            }
        }
        return s;
    }
};

8. 字符串相乘

在这里插入图片描述

题目思路:

模拟数字乘法, 如果其中有一个为0直接返回0, 然后取出依次乘数的最后一位将结果范围底数和进位, 分别进行运算, 再依次取出被乘数, 但是在运算过程中, 除了最后一个数字相乘时, 其他都需要补0, 并将结果尾插到字符串中, 然后进行反转, 每一次躺求的结果进行加法, 可以根据我们实现加法的方法 , 最后返回结果.

参考代码:

class Solution {
public:
    string multiply(string num1, string num2) {
        string ans = "0";
        if (num1 == "0" || num2 == "0") {
            return "0";
        }
        int m = num1.size(), n = num2.size();
        for (int i = n - 1; i >= 0; i--) // 相乘多少次
        {
            int add = 0;
            string cur; // 记录每趟相乘结果
            for (int j = n - 1; j > i; j--) {
                cur.push_back(0);
            }
            int y = num2[i] - '0';
            for (int j = m - 1; j >= 0; j--) {
                int x = num1[j] - '0';
                int product = x * y + add;
                cur.push_back(product % 10);
                add = product / 10;
            }
            if (add != 0)
                cur.push_back(add);
            reverse(cur.begin(), cur.end());
            for (auto& c : cur) {
                c += '0';
            }

            ans = Stringadd(cur, ans);
        }
        return ans;
    }
    string Stringadd(string& num1, string& num2) {
        int i = num1.size() - 1, j = num2.size() - 1;
        int add = 0;
        string ansl;
        while (i >= 0 || j >= 0 || add) {
            int x = i >= 0 ? num1[i--] - '0' : 0;
            int y = j >= 0 ? num2[j--] - '0' : 0;
            int result = x + y + add;
            ansl.push_back(result % 10);
            add = result / 10;
        }

        for (auto& c : ansl) {
            c += '0';
        }
        reverse(ansl.begin(), ansl.end());
        return ansl;
    }
};

9. 打印日期

在这里插入图片描述

题目思路:

自一月开始, 如果天数小于当前月份最大天数, 则直接格式化输出, 如果天数大于当前月份最大天数, 则减去当前月份的天数, 进入下一个月份, 这里需要判断闰年, 如果为闰年, 则天数为29天.

参考代码:

#include <iostream>
using namespace std;

int main() {
    int year,count;
    while (cin >> year >> count) { // 注意 while 处理多个 case
         int months[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
         if((year%4==0 && year % 100 !=0)||year % 400 ==0)
         {
            months[1] = 29;
         }
         for(int i = 0;i < 12 ;i++)
         {
            if(count <= months[i])
            {
                 printf("%04d-%02d-%02d\n", year, i + 1, count);
                 break;
            }
            else
            {
                count -= months[i];
            }
         }
    }
}

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

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

相关文章

llama 2 改进之 RMSNorm

RMSNorm 论文&#xff1a;https://openreview.net/pdf?idSygkZ3MTJE Github&#xff1a;https://github.com/bzhangGo/rmsnorm?tabreadme-ov-file 论文假设LayerNorm中的重新居中不变性是可有可无的&#xff0c;并提出了均方根层归一化(RMSNorm)。RMSNorm根据均方根(RMS)将…

DolphinScheduler安装教程

DolphinScheduler安装教程 前期准备工作 jdk 1.8mysql 5zookeeper 3.4.6hadoop 2.6psmisc yum -y install psmisc 解压安装包 # 将安装包apache-dolphinscheduler-2.0.8-bin.tar.gz放置/opt/download目录下 # 解压缩 tar -zxvf apache-dolphinscheduler-2.0.8-bin.tar.gz -C …

MYSQL 第二次作业

要求&#xff1a; mysgl>create database mydb8 worker; mysq> use mydb8 worker; mysgl>create table t worker( department id int(11)not null comment部门号, worker id int(11)primary key not null comment职工号, worker date date not null comment工作时间,…

使用wireshark第一次捕获数据包

打开wireshark&#xff1a; 点击捕获&#xff0c;选项。 这里我选择以太网&#xff0c;然后点开始&#xff1a; 然后就成这样了&#xff1a; 点击左上角那个红色的按钮&#xff0c;可以暂停捕获&#xff0c;就变成了下面的样子&#xff1a; 这三个框有自己的名字&…

Nginx 怎样处理请求的重试机制?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 Nginx 怎样处理请求的重试机制&#xff1f;一、为何需要重试机制&#xff1f;二、Nginx 中的重试机制原理三、Nginx 重试机制的配置参数四、Nginx 重试机制的实际…

【MySQL进阶之路 | 高级篇】范式概述与第一范式

1. 范式简介 在关系型数据库中&#xff0c;关于数据表的设计的基本原则&#xff0c;规则就称为范式。可以理解为&#xff0c;一张数据表的设计结果需要满足的某种设计标准的级别。要想设计一个结构合理的关系型数据库&#xff0c;必须满足一定的范式。 范式的英文名是Normal …

MongoDB教程(十八):MongoDB MapReduce

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、MapRed…

阿里云ubuntu宝塔面板部署uni-app-flask-websocket前后端项目

1.下载宝塔面板 wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh ed8484bec 然后去安全组开放对应的端口 面板账户登录信息 【云服务器】请在安全组放行 29725 端口 进入控制面板后修改默认用户名和密码 2. …

Flask 框架 redirect() url_for()

url_for url_for 函数根据传入的端点名称&#xff08;即路由函数名&#xff09;生成对应的 URL。 1. url_for() url_for 函数根据传入的端点名称&#xff08;即路由函数名&#xff09;生成对应的 URL。 它接受一个或多个参数&#xff0c;其中第一个参数是路由的名称&#x…

antdesgin table 组件下载成excel

文章目录 发现宝藏一、需求二、报错 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【宝藏入口】。 一、需求 原组件如下&#xff0c;需要添加下载功能 import React, { useState } from rea…

学习测试10-3自动化 web自动化

web自动化 chrome驱动下载地址&#xff1a; https://registry.npmmirror.com/binary.html?pathchromedriver/ https://googlechromelabs.github.io/chrome-for-testing/#stable观察Google版本&#xff0c;下相应的驱动 运行代码试试&#xff0c;成功Google就会弹出 from se…

记录|C#+winform创建扁平化风格界面

本项目的C#内容是自己跟做的&#xff0c;自己做的内容已经打包&#xff0c;可以通过自己跟做写的Dashboard界面&#xff0c;C#下的winform模式下载获得&#xff0c;但是需要花费3个积分 目录 前言一、左边设置和步骤界面步骤Step1.Step2.Step3.Step4Step5 二、右边属性和步骤属…

【PyTorch】基于LSTM网络的气温预测模型实现

假设CSV文件名为temperature_data.csv&#xff0c;其前五行和标题如下&#xff1a; 这里&#xff0c;我们只使用Temperature列进行单步预测。以下是整合的代码示例&#xff1a; import pandas as pd import numpy as np import torch import torch.nn as nn import torch.op…

【深度学习】yolov8-seg分割训练,拼接图的分割复原

文章目录 项目背景造数据训练 项目背景 在日常开发中&#xff0c;经常会遇到一些图片是由多个图片拼接来的&#xff0c;如下图就是三个图片横向拼接来的。是否可以利用yolov8-seg模型来识别出这张图片的三张子图区域呢&#xff0c;这是文本要做的事情。 造数据 假设拼接方式有…

Qt+OpenCascade开发笔记(一):occ的windows开发环境搭建(一):OpenCascade介绍、下载和安装过程

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140604141 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

OpenStack Yoga版安装笔记(八)glance练习补充2

1、openstack image list数据流回顾 OpenStack Yoga版安装笔记&#xff08;七&#xff09;通过Wireshark抓包、Mermaid绘图&#xff0c;解析了执行openstack image list的数据流&#xff0c;图示如下&#xff1a; 数据流1-4&#xff1a;user admin认证&#xff0c;并获得admin…

ros2--中间件--rmw

rmw robot middleware 什么是中间件 一套位于操作系统之上&#xff0c;引用程序之下的软件。 在ros2中理解就是&#xff1a;中间件就是介于某两个或者多个节点中间的组件 中间件的作用 就是提供多个节点中间通信用的。 教程 ROS2中间件DDS架构 ros2从入门到精通

使用puma部署ruby on rails的记录

之前写过一篇《记录一下我的Ruby On Rails的systemd服务脚本》的记录&#xff0c;现在补上一个比较政治正确的Ruby On Rails的生产环境部署记录。使用Puma部署项目。 创建文件 /usr/lib/systemd/system/puma.service [Unit] DescriptionPuma HTTP Server DocumentationRuby O…

在Linux、Windows和macOS上释放IP地址并重新获取新IP地址的方法

文章目录 LinuxWindowsmacOS 在Linux、Windows和macOS上释放IP地址并重新获取新IP地址的方法各有不同。以下是针对每种操作系统的详细步骤&#xff1a; Linux 使用DHCP客户端&#xff1a;大多数Linux发行版都使用DHCP&#xff08;动态主机配置协议&#xff09;来自动获取IP地址…

RT-Thread全球嵌入式电子设计大赛入选名单发布!

目录 概述 ​1 瑞萨 RA8D1 Vision Board 2 英飞凌 Psoc6-EvaluationKit-062S2 WIFI模块 3 恩智浦 FRDM-MCXN947 4 STM32 星火一号 STM32F407 5 先楫 HPM5300EVK (RISC-V) 6 自带开发板 概述 RT-Thread全球嵌入式电子设计大赛入选名单发布啦&#xff0c;如下名单的小…