首页 > 其他分享 >Leetcode之string

Leetcode之string

时间:2024-07-23 21:27:29浏览次数:11  
标签:begin end string int 字符串 return Leetcode

目录

前言

本篇整理了一些关于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];
            }
         }
    }
}

标签:begin,end,string,int,字符串,return,Leetcode
From: https://blog.csdn.net/2201_75644377/article/details/140615100

相关文章

  • LeetCode102.二叉树的层序遍历
    LeetCode题目链接:https://leetcode.cn/problems/binary-tree-level-order-traversal/submissions/548489149/题目叙述:给你一个二叉树,请你返回其按层序遍历得到的节点值。(即逐层地,从左到右访问所有节点)。这道题就是简单的叫我们求层序遍历的代码,二叉树的层序遍历实际上就是......
  • Java---String类
    乐观学习,乐观生活,才能不断前进啊!!!我的主页:optimistic_chen我的专栏:c语言,Java欢迎大家访问~创作不易,大佬们点赞鼓励下吧~前言在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,......
  • 代码随想录算法训练营Day7 | Leetcode 454 四数相加Ⅱ Leetcode 383 赎金信 Leetcode
    前言今天的四道题目稍稍有点难度,需要理解和反复记忆才行。四数相加类比于两数之和,赎金信类比于异位词,三数之和和四数之和自成体系,可以推广到n数之和。Leetcode454四数相加Ⅱ题目链接:454.四数相加II-力扣(LeetCode)代码随想录题解:代码随想录(programmercarl.com)思路:......
  • 代码随想录算法训练营Day5、6 | Leetcode 242 有效字母的异位词 Leetcode 349 两个数
    前言因为昨天休息所以把两天合并成一天来写,昨天把上周的题又重写了一遍,发现一些细节还是要注意。今天的题目都是查找,也涉及到了最近正在学的STL。Leetcode242有效字母的异位词 题目链接:https://leetcode.cn/problems/valid-anagram/description/代码随想录题解:代码随想......
  • 代码随想录算法训练营第四天 | Leetcode 24 两两交换链表中的节点 Leetcode 19 删除链
    前言今天链表的内容突出一个注意细节,判空条件,头节点是否为空等等。采用虚拟头节点可以方便链表进行更改,还需要学会使用临时变量。 Leetcode24两两交换链表中的节点题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/代码随想录题解:代码随想录(programmercarl.......
  • 代码随想录算法训练营第三天 | Leetcode 203 移除链表元素 Leetcode 206 翻转链表
    前言今天的两道题目都不难,但细节需要注意。如移除链表元素用到的虚拟头节点,翻转链表的思路。翻转链表真是写了忘,忘了写,希望这次能记住。除此之外我决定每天的记录里面增加一个总结八股的部分,将来二刷再翻看文章的时候顺便也能复习八股知识点。Leetcode203移除链表元素题目......
  • String 的 intern() 方法
    问题: Strings1=“a”+“b”;//创建了几个对象?Strings2=newString(“ab”);//创建了几个对象?Strings3=newString(“a”)+newString(“b”);//创建了几个对象?Strings4=newString(“a”)+newString(“a”);s4.intern();//创建了几个对象? 关于i......
  • 每日一题:Leetcode-322 零钱兑换
    力扣题目解题思路java代码力扣题目:给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。示例......
  • 【c++经典面试题】有关string类的深浅拷贝
    题目背景基于自实现string类substr成员函数时遇到的问题。代码展示stringstring::substr(size_tpos,size_tlen)//声明时len的参省值位npos { assert(pos<_size); if(len>_size-pos)//如果len的长度大于有效字符长度,那么重置为有效字符长度 { le......
  • 【代码随想录训练营第42期 Day6打卡 LeetCode 242.有效的字母异位词 349.两个数组的交
    目录一、序言二、哈希表的相关知识1.基本概念2.常见的哈希结构3.总结三、题目及其题解242.有效的字母异位词题目链接题解思路1思路2思路3349.两个数组的交集题目链接题解202.快乐数题目链接题解1.两数之和题目链接题解思路1思路2四、小结一、序言......