【LeetCode】string 类的几道简单题

news2024/11/15 7:10:18

​🌠 作者:@阿亮joy.
🎆专栏:《阿亮爱刷题》
🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根
在这里插入图片描述

👉仅反转字母👈

给你一个字符串 s ,根据下述规则反转字符串:

  • 所有非英文字母保留在原有位置。
  • 所有英文字母(小写或大写)位置反转。

返回反转后的 s 。

在这里插入图片描述

思路:这道题可以借助快排的思想,左边找出字母,右边找出字母,然后进行交换。如果不是字母,就继续找。

class Solution 
{
public:
    string reverseOnlyLetters(string s) 
    {
        size_t begin = 0;
        size_t end = s.size() - 1;
        while(begin < end)
        {
            // isalpha是判断是否是字母的函数接口
            while(begin < end && !isalpha(s[begin]))
            {
                ++begin;
            }
            while(begin < end && !isalpha(s[end]))
            {
                --end;
            }

            swap(s[begin], s[end]);
            ++begin;
            --end;
        }
        return s;
    }
};

在这里插入图片描述

👉字符串中的第一个唯一字符👈

给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。

在这里插入图片描述

思路:可以借助哈希映射的思想,用一个数组统计每个字母出现的次数,然后再遍历字符串就能够知道那个字母是第一个唯一字符。

class Solution 
{
public:
    int firstUniqChar(string s) 
    {
        int count[26] = {0};
        // 统计字母出现的次数
        for(auto ch : s)
        {
            ++count[ch - 'a'];
        }

        // 顺序遍历字符串,找出第一个唯一字母
        for(int i = 0; i < s.size(); i++)
        {
            if(count[s[i] - 'a'] == 1)
                return i;            
        }
        return -1;
    }
};

在这里插入图片描述

👉字符串相加👈

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

在这里插入图片描述
思路:这道题主要考察的就是竖式相加,我们可以从字符串的末尾依次往前相加,并保存进位信息。那如何将这个过程转换成代码呢?先定义两个变量end1end2,并初始化为size - 1,如何利用 while 循环从后往前遍历字符串。当end1end2都小于0时,while 循环结束。在while 循环里,定义三个变量val1val2retret等于val1 + val2 + carry,其中carry为进位信息,其值为ret / 10。如果end小于0,则val的值为0。现在我们已经得到了相加的结果和进位信息了,就可以将数据插入到字符串。插入有两种方式,可以头插,也可以尾插。如果采用头插,效率会比较低,因为需要挪动数据。如果采用尾插,循环结束后需要将字符串逆置一下。

class Solution 
{
public:
    string addStrings(string num1, string num2) 
    {
        int end1 = num1.size() - 1, end2 = num2.size() - 1;
        int carry = 0;
        string retStr;
        retStr.reserve(max(num1.size(), num2.size()) + 1);

        while(end1 >= 0 || end2 >= 0)
        {
            int val1 = end1 >= 0 ? num1[end1] - '0' : 0;
            int val2 = end2 >= 0 ? num2[end2] - '0' : 0;
            int ret = val1 + val2 + carry;
            carry = ret / 10;
            ret %= 10;

            retStr.insert(0, 1, '0' + ret);
            --end1;
            --end2;
        }
		// 处理进位信息
        if(carry == 1)
            retStr.insert(0, 1, '1');

        return retStr;
    }
};

在这里插入图片描述

class Solution 
{
public:
    string addStrings(string num1, string num2) 
    {
        int end1 = num1.size() - 1, end2 = num2.size() - 1;
        int carry = 0;
        string retStr;
        retStr.reserve(max(num1.size(), num2.size()) + 1);

        while(end1 >= 0 || end2 >= 0)
        {
            int val1 = end1 >= 0 ? num1[end1] - '0' : 0;
            int val2 = end2 >= 0 ? num2[end2] - '0' : 0;
            int ret = val1 + val2 + carry;
            carry = ret / 10;
            ret %= 10;

            retStr += '0' + ret;
            --end1;
            --end2;
        }
		// 处理进位信息
        if(carry == 1)
            retStr += '1';
        // 逆置字符串
        reverse(retStr.begin(), retStr.end());
        return retStr;
    }
};

在这里插入图片描述

👉字符串相乘👈

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

在这里插入图片描述

思路:首先将补零,将 num2 的每位数字和 num1 相乘的结果存到 ret1 里,再将 ret1 逆置就能得到 num2 的低位到高位与 num1 相乘的结果,最后将 ret1 加到结果 ret 上,ret 就是最终相乘的结果了。

在这里插入图片描述

class Solution 
{
public:
    string addStrings(string num1, string num2) 
    {
        int end1 = num1.size() - 1, end2 = num2.size() - 1;
        int carry = 0;
        string retStr;
        retStr.reserve(max(num1.size(), num2.size()) + 1);

        while(end1 >= 0 || end2 >= 0)
        {
            int val1 = end1 >= 0 ? num1[end1] - '0' : 0;
            int val2 = end2 >= 0 ? num2[end2] - '0' : 0;
            int ret = val1 + val2 + carry;
            carry = ret / 10;
            ret %= 10;

            retStr += '0' + ret;
            --end1;
            --end2;
        }

        if(carry == 1)
            retStr += '1';
        
        reverse(retStr.begin(), retStr.end());
        return retStr;
    }

    string multiply(string num1, string num2) 
    {
        // 思路:首先将补零,将num2的每位数字和num1相乘的结果存到ret1里
        // 再将ret1逆置就能得到num2的个位、十位和百位与num1相乘的结果
        // 再将ret1加到结果ret上,ret就是最终相乘的结果了
        string ret("0");
        if(num1[0] == '0' || num2[0] == '0')
        {
            return ret;
        }
        int size1 = (int)num1.size();
        int size2 = (int)num2.size();
        for(int i = size2 - 1; i >=  0; i--)
        {
            string ret1;
            for(int j = 0; j < size2 - 1 - i; j++)
            {
                ret1.append(1, '0');
            }
            
            int carry = 0;
            for(int j = size1 - 1; j >= 0; j--)
            {
                int val1 = num1[j] - '0';
                int val2 = num2[i] - '0';
                int ret2 = val1 * val2 + carry;
                carry = ret2 / 10;
                ret1.append(1, '0' + ret2 % 10);
            }
            if(carry > 0)
            {
                ret1.append(1, '0' + carry);
            }
            reverse(ret1.begin(), ret1.end());
            ret = addStrings(ret, ret1);
        }

        return ret;
    }
};

在这里插入图片描述

👉反转字符串中的单词 III👈

给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

在这里插入图片描述

思路:定义两个变量posprevpospos的初始值为第一个空格所在的位置,prevpos的初始值为0。当pos != string::npos时,进入 while 循环,将prevpospos之间的字符逆置,逆置之后,prevpos = pos + 1pos等于下一个空格的位置;while 循环结束,将prevposs.size()-1之间的字符逆置,然后字符串的单词都逆置过来了。

class Solution 
{
public:
	// 逆置算法
    void reverse(string& s, size_t begin, size_t end)
    {
        while(begin < end)
        {
            swap(s[begin++], s[end--]);        
        }
    }

    string reverseWords(string s) 
    {
        size_t pos = s.find(' ', 0);
        size_t prevpos = 0;
        while(pos != string::npos)
        {
            reverse(s, prevpos, pos - 1);
            prevpos = pos + 1;
            pos = s.find(' ', pos + 1);
        }
        reverse(s, prevpos, s.size() - 1);
        return s;
    }
};

在这里插入图片描述

👉反转字符串 II👈

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

在这里插入图片描述

思路:先定义一个逆置算法的函数,然后判断剩余的字符有多少,然后进行相应的操作就行了。

class Solution 
{
public:
  //翻转start到end区间的字符串
  void Reverse(string &s, int start, int end)
  {
    char tmp;
    while(start < end)
    {
      tmp = s[start];
      s[start] = s[end];
      s[end] = tmp;
      start++;
      end--;
    }
  }

  string reverseStr(string s, int k) 
  {
    int len = s.size();
    for(int i = 0; i < len; i += 2 * k)
    {
        // 剩余字符大于k个
        if(i + k - 1 < len)
            Reverse(s, i, i + k - 1);
        else  // 剩余字符小于或等于k个
            Reverse(s, i, len - 1);
    }
    return s;
  }
};

在这里插入图片描述

👉总结👈

好久没有写过刷题博客了,上次写的时候还是在上次。希望大家能够喜欢,那么以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家!💖💝❣️

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

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

相关文章

Java源代码到用户使用都经历了哪些阶段

1、测试好的代码是如何部署给用户的。 首先&#xff1a;写好的代码通过打包生成jar包放到一个服务器上运行&#xff0c;服务器上需要有Java虚拟机&#xff0c;当然可以在存放jar包的服务器上安装数据库&#xff0c;或者把服务器放到另外一台服务器上也可以&#xff0c;但是在代…

SpringCloud-04-Feign

一、Feign介绍 Feign是一个声明式web服务客户机。它使编写web服务客户机更容易。要使用Feign创建一个接口并对其进行注释。它具有可插入注释支持&#xff0c;包括Feign注释和JAX-RS注释。Feign还支持可插式编码器和解码器。Spring Cloud增加了对Spring MVC注释的支持&#xff…

10个全球最佳免费土地覆被/土地利用数据资源

不知道大家有没有想过&#xff0c;在我们来到地球的一生时间中&#xff0c;地球会有多大的变化呢? 是在空旷的草地新建了公园&#xff0c;还是低矮的平房变成了一座座大厦? 这些林林总总的变化&#xff0c;总是令人应接不暇。然而&#xff0c;在漫长的人类历史历程中&#xf…

2022亚太数学杯数学建模竞赛A题(思路分析......)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Java数据类型:基本数据类型和引用数据类型

Java 语言是强类型语言&#xff0c;编译器存储在变量中的数值具有适当的数据类型。学习任何一种编程语言都要了解其数据类型&#xff0c;下面将详细介绍 Java 中的数据类型。 Java 语言支持的数据类型分为两种&#xff1a;基本数据类型&#xff08;Primitive Type&#xff09;…

NET CORE Configuraion 使用详解

相关配置 <Project Sdk"Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>netcoreapp3.1</TargetFramework></PropertyGroup><ItemGroup><!--读取配置的核心包--><Packa…

谷歌浏览器自定义标签页 newtab

创建一个文件夹, 里面放置信息: 其中&#xff0c; manifest.json 不能变&#xff0c; home.html 是新的标签页信息 manifest.json 内容: {"chrome_url_overrides": {"newtab": "home.html"},"manifest_version": 2,"name"…

新知实验室TRTC 初体验

引言 随着短视频行业的不断发展&#xff0c;人们对实时音视频的需求越来越多。在线直播&#xff08;秀场直播、电商直播、赛事直播、新品发布会、路演、在线拍卖&#xff09;的相关产品不断涌现&#xff0c;百花齐放。对于业务来说&#xff0c;自研开发一个实时音视频服务&…

spring boot 过滤器拦截器与aop

目录 一、过滤器 (Filter) 1.1 什么是过滤器 1.2 springboot配置过滤器 方式一&#xff1a;使用WebFilter 二、拦截器(Interceptor) 2.1 什么是拦截器 2.2 使用拦截器方法 三、拦截器&过滤器与spring aop的区别 3.1 区别 3.2添加aop 适用场景&#xff1a; 拦截…

Vue3中jsx父子传值、provide和inject、v-memo指令、Teleport内置组件、KeepAlive缓存组件、transition过渡组件

文章目录1. jsx父子传值2. provide和inject3. v-memo指令4. Teleport内置组件5. KeepAlive缓存组件6. transition过渡组件1. jsx父子传值 父组件&#xff1a; <template><div><child :title"title" :setTitle"setTitle" /></div>…

GitHub下载量过百万,阿里P8秘密分享的「亿级并发系统设计」真香

随着互联网的不断发展&#xff0c;CPU硬件的核心数也在不断进步&#xff0c;并发编程越来越普及&#xff0c;但是并发编程并不像其他业务那样直接了当。在编写并发程序时&#xff0c;我们常常都会出现各种漏洞&#xff0c;这些问题往往都突然出现&#xff0c;然后又迅速消失&am…

Java编码与解码

首先区分加密与编码并不是一回事&#xff0c; 本节主要讲述常见的三种编解码方式&#xff0c;分别为&#xff1a;Unicode、URL、Base64。 常见编码算法&#xff1a; Unicode编码&#xff1a;每一字符都可变成以 \u 开头&#xff0c;长度为6的字符串。URL编码&#xff1a;以百分…

Java并发编程--多线程间的同步控制和通信

使用多线程并发处理&#xff0c;目的是为了让程序更充分地利用CPU &#xff0c;好能加快程序的处理速度和用户体验。如果每个线程各自处理的部分互不相干&#xff0c;那真是极好的&#xff0c;我们在程序主线程要做的同步控制最多也就是等待几个工作线程的执行完毕&#xff0c;…

JS表达式完全攻略

在语法概念中&#xff0c;运算符属于词&#xff0c;表达式属于短语。表达式由一个或多个运算符、操作数组成的运算式。表达式的功能是执行计算&#xff0c;并返回一个值。 表达式的形式 表达式是一个比较富有弹性的运算单元。简单的表达式就是一个直接量、常量或变量。例如&a…

【优化调度】粒子群算法求解水火电调度优化问题【含Matlab源码 1181期】

⛄一、粒子群算法简介 1 引言 自然界中的鸟群和鱼群的群体行为一直是科学家的研究兴趣所在。生物学家Craig Reynolds在1987年提出了一个非常有影响的鸟群聚集模型&#xff0c;在他的仿真中&#xff0c;每一个个体都遵循&#xff1a;避免与邻域个体相撞&#xff1a;匹配邻域个体…

Java面向对象之——封装

文章目录前言一、封装的概念二、何为封装&#xff1f;三、封装拓展——包&#x1f351;1、包的概念&#x1f351;2、导入包中的类&#x1f351;3、自定义包&#x1f351;4、常见的包四、访问限定符&#x1f351;1、public修饰符&#x1f351;2、private修饰符&#x1f351;3、默…

软件产品确认测试包括哪些方面

1.技术方面 确认测试又称有效性测试&#xff0c;是在模拟的环境下&#xff0c;运用黑盒测试的方法&#xff0c;验证被测软件是否满足需求规格说明书列出的需求。 确认测试的目的是向未来的用户表明系统能够像预定要求那样工作。经集成测试后&#xff0c;已经按照设计把所有的模…

Docker 下 jitsi-meet 视频服务器 安装部署

一、参考网站 官网文档地址&#xff1a;Self-Hosting Guide - Docker | Jitsi Meet 二、Docker 版本 三、安装部署 3.1、下载并解压缩安装包 地址&#xff1a;Release stable-8044: release jitsi/docker-jitsi-meet GitHub CSDN地址&#xff1a;docker-jitsi-meet-stab…

visdom安装及使用

目录1. 安装visdom的流程2. 使用流程1. 安装visdom的流程 重点参考链接&#xff1a;visdom安装出现Downloading scripts, this may take a little while然后就不动了 先去到github直接下载了visdom的压缩包&#xff1a;https://github.com/fossasia/visdom然后将visdom-maste…