首页 > 编程语言 >算法训练day8 LeetCode 344

算法训练day8 LeetCode 344

时间:2023-09-23 14:00:35浏览次数:34  
标签:string day8 int 344 ++ password LeetCode size

算法训练day8: LeetCode 344.541.151.剑指offer05.58.

344.反转字符串

题目

344. 反转字符串 - 力扣(LeetCode)

题解

代码随想录 (programmercarl.com)

  • class Solution
    {
    public:
        void reverseString(vector<char> &s)
        {
            for (int i = 0, j = s.size() - 1; i < j; i++, j--)
            {
                swap(s[i], s[j]);
            }
        }
    };
    

    代码实现还是很简单的,解题时体现程序主要思想的地方不要使用库函数。

541.反转字符串II

题目

541. 反转字符串 II - 力扣(LeetCode)

题解

代码随想录 (programmercarl.com)

  • class Solution {
    public:
        string reverseStr(string s, int k) {
            for(int i=0;i<s.size();i+=(2*k))
            {
                if(i+k<=s.size())
                reverse(s.begin()+i,s.begin()+i+k);
                else
                {
                    reverse(s.begin()+i,s.end());
                }
            }
            return s;
        }
    };
    
  • 整体思路没问题,突然有事,先用reverse写完了

剑指Offer 05.替换空格

题目

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 1: 输入:s = "We are happy."
输出:"We%20are%20happy."

题解

代码随想录 (programmercarl.com)

  • 从后向前添加

    • 不开辟新数组
    • 避免从前向后移动每次添加都需要把添加元素之后全部元素移动的问题
    class Solution
    {
    public:
        string replaceSpace(string s)
        {
            int count = 0;
            int sOldsize = s.size();
            for (int i = 0; i < s.size(); i++)
            {
                if (s[i] == ' ')
                    count++;
            }
    
            s.resize(s.size() + count * 2);
            int sNewsize = s.size();
            for (int i = sNewsize - 1, j = sOldsize - 1; j < i; i--, j--)
            {
                if (s[i] != ' ')
                {
                    s[j] = s[i];
                }
                else
                {
                    s[j] = '0';
                    s[j - 1] = '2';
                    s[j - 2] = '%';
                    j -= 2;
                }
            }
            return s;
        }
    };
    

151.翻转字符串里的单词

题目

151. 反转字符串中的单词 - 力扣(LeetCode)

题解

代码随想录 (programmercarl.com)

  • 整体思路:

    • 去除多余空格

      • 双指针,除第一个单词外,每个单词前加一个空格
      • 快指针识别单词开始,慢指针添加空格后与快指针同步移动实现单词复制
      • 更改去除空格后的结构大小(slow)
    • 整体反转实现单词整体顺序的反转

    • 对单个单词操作,实现单词内部字母顺序的调整

    class Solution
    {
    public:
        void removeExtraSpace(string &s)
        {
            int slow = 0;
            for (int i = 0; i < s.size(); i++)
            {
                if (s[i] != ' ')
                {
                    if (slow != 0)
                        s[slow++] = ' ';
                    while (i < s.size() && s[i] != ' ')
                    {
                        s[slow++] = s[i++];
                    }
                }
            }
            s.resize(slow);
        }
        void reverse(string &s, int start, int end)
        {
            for (int i = start, j = end; i < j; i++, j--)
            {
                swap(s[i], s[j]);
            }
        }
    
        string reverseWords(string s)
        {
            removeExtraSpace(s);
            reverse(s, 0, s.size() - 1);
            int start = 0;
            for (int i = 0; i <= s.size(); ++i)
            {
                if (s[i] == ' ' || i == s.size())
                {
                    reverse(s, start, i - 1);
                    start = i + 1;
                }
            }
            return s;
        }
    };
    

剑指Offer58-II.左旋转字符串

题目

LCR 182. 动态口令 - 力扣(LeetCode)

题解

LCR 182. 动态口令 - 力扣(LeetCode)

  • 原本想以首位项链模拟旋转的方式解决,但是时间复杂度很高

  • 采用局部反转+整体旋转的方法

  • class Solution
    {
    public:
        void reverse(string &s, int start, int end)
        {
            for (int i = start, j = end; i < j; i++, j--)
            {
                swap(s[i], s[j]);
            }
        }
        string dynamicPassword(string password, int target)
        {
            reverse(password, 0, target - 1);
            reverse(password, target, password.size() - 1);
            reverse(password, 0, password.size() - 1);
            return password;
        }
    };
    

标签:string,day8,int,344,++,password,LeetCode,size
From: https://www.cnblogs.com/High-source/p/17724319.html

相关文章

  • macOS Sonoma 14 RC2(23A344)/Ventura13.6/Monterey 12.7 三版系统同时更新
    以下是一篇黑果魏叔关于【macOSSonoma14RC2(23A344)/macOS13.6/macOS12.7同时更新】的文章,希望对您有所帮助。近日,苹果公司发布了macOSSonoma14RC2(23A344)版本更新,这标志着苹果公司继推出macOSBigSur和macOSMonterey之后,再次为macOS系统带来了新的升级。此次升级......
  • 算法训练day17 LeetCode 110
    算法训练day17LeetCode110.257.404110平衡二叉树题目110.平衡二叉树-力扣(LeetCode)题解代码随想录(programmercarl.com)当子树已经不平衡,直接返回-1.平衡则返回子数高度进行更高树间的高度比较classSolution{public:intgetHeight(TreeNode*node)......
  • 【LeetCode】2591. 将钱分给最多的儿童
    描述给你一个整数money,表示你总共有的钱数(单位为美元)和另一个整数children,表示你要将钱分配给多少个儿童。你需要按照如下规则分配:所有的钱都必须被分配。每个儿童至少获得1美元。没有人获得4美元。请你按照上述规则分配金钱,并返回最多有多少个儿童获得恰好8......
  • LeetCode3题学透链表初始化、查找、插入删除、逆置操作
    1.题目要求LeetCode203移除链表指定元素LeetCode707设计链表LeetCode206反转链表  这三个题目包含了链表的初始化、插入头尾结点、插入删除第n个结点,删除指定内容的结点、链表的逆置等,下面我将一一讲解并展示源代码。2.具体操作2.1LeetCode中链表的初始化  我下面所讲......
  • [leetcode] 10. 正则表达式匹配
    10.正则表达式匹配给你一个字符串s和一个字符规律p,请你来实现一个支持'.'和'*'的正则表达式匹配。'.'匹配任意单个字符'*'匹配零个或多个前面的那一个元素所谓匹配,是要涵盖整个字符串s的,而不是部分字符串。示例1:输入:s="aa",p="a"输出:false解释:"a"无......
  • 【LeetCode】收集树中金币
    链接题目给你一个n个节点的无向无根树,节点编号从0到n-1。给你整数n和一个长度为n-1的二维整数数组edges,其中edges[i]=[ai,bi]表示树中节点ai和bi之间有一条边。再给你一个长度为n的数组coins,其中coins[i]可能为0也可能为1,1表示节点i处有......
  • 日常记录--day8--2023-9月21日--周四
    日程:今天满课,累死了,早上7点起床,吃早饭,去上课。上午体测,跑了个一千米,差点没去世,下午数据结构加离散数学,今天主要学了栈,写了个简单的,晚上8-9点继续javaweb,今天也没有力扣。学了什么:Javaweb让人头疼,复习了之前的力扣题,继续学习Javaweb。PS:不想学习,想要成为卫生纸;......
  • Leetcode刷题448.找到所有数组中消失的数字
    给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1,n] 内。请你找出所有在 [1,n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。 示例1:输入:nums=[4,3,2,7,8,2,3,1]输出:[5,6]示例2:输入:nums=[1,1]输出:[2] 提示:n==nums.lengt......
  • Leetcode刷题283.移动零
    给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例1:输入:nums=[0,1,0,3,12]输出:[1,3,12,0,0]示例2:输入:nums=[0]输出:[0] 提示:1<=nums.length<......
  • LeetCode53.最大子数组和
    要求最大连续子数组的和,可以这样考虑,比如现在我想求下标 i~j,i<j 这一范围内子数组的和,那么我可以分别先求出 0~i-1 范围和 0~j 范围两个子数组的和,可得Sum[i~j]=Sum[0~j]-Sum[0~i-1] ,这就是本题解法的核心思想。解法详细描述:先从下标0开始,遍历 nums 数组,求出到当前下标......