ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode刷题——字符串1

2021-09-16 11:35:18  阅读:168  来源: 互联网

标签:string int 反转 ans 字符串 2k LeetCode 刷题


LeetCode刷题——字符串1

反转字符串 II

  • 题目链接.
  • 题意:给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
  • 思路:题目要求每2k个字符要进行一次反转。用l来记录字符串的长度,l>0作为循环条件,每反转一次l=l-2k,m+1记录循环次数,用m得到要反转的字符起始位置。
class Solution {
public:
    string reverseStr(string s, int k) {
        int l=size(s);
        int i,j,m=0;
        while(l>0){
            if(l<k){
                for(i=m*k,j=size(s)-1;i<j;i++,j--){
                    char t=s[i];
                    s[i]=s[j];
                    s[j]=t;
                }
            }
            else{
                for(i=m*k,j=i+k-1;i<j;i++,j--){
                    char t=s[i];
                    s[i]=s[j];
                    s[j]=t;
                }
            }
            l=l-2*k;
            m=m+2;
        }


        return s;
    }
};

剑指 Offer 58 - II. 左旋转字符串

  • 题目链接.
  • 题意:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
  • 思路
  1. 切片,将字符串分割为两个,然后交换顺序相加。
class Solution {
public:
    string reverseLeftWords(string s, int n) {
        string a,b;
        int i=0;
        for(auto ss:s){
            if(i<n){
                a.push_back(ss);
            }
            else{
                b.push_back(ss);
            }
            i++;
        }
        b=b+a;
        return b;
    }
};
  1. 原地翻转字符串,三次翻转 。
    1.反转区间为前n的子串,2. 反转区间为n到末尾的子,3. 反转整个字符串
class Solution {
public:
    string reverseLeftWords(string s, int n) {
        //三次翻转 1.反转区间为前n的子串,2. 反转区间为n到末尾的子,3. 反转整个字符串
        for(int i=0,j=n-1;i<j;++i,--j){
            char t=s[i];
            s[i]=s[j];
            s[j]=t;
        }
        for(int i=n,j=size(s)-1;i<j;++i,--j){
            char t=s[i];
            s[i]=s[j];
            s[j]=t;
        }
        for(int i=0,j=size(s)-1;i<j;++i,--j){
            char t=s[i];
            s[i]=s[j];
            s[j]=t;
        }
        return s;
    }
};

翻转字符串里的单词

  • 题目链接
  • 题意:给你一个字符串 s ,逐个翻转字符串中的所有单词 。
  • 思路:遍历字符串,当s[i]为空格时,跳过空格,当s[i]不为空格时,使用j来查找下一个空格的位置,此时我们知道s[i]s[j]之间存在一个单词,使用s.substr(i,j-i)(i是起始位置,j-i是剪切个数)提取出这个单词加入vector,然后令i=j继续进行循环。将所有单词加入vector之后,对vector进行倒序遍历,ans=ans+a[i]+' ';最后再加上a[0],得到结果。
class Solution {
public:
    string reverseWords(string s) {
        vector<string> a;
        string ans;
        for(int i=0;i<size(s);++i){
            if(s[i]==' ') continue;
            else{
                int j=i;
                while(s[j]!=' '&&j<size(s)){
                    j++;
                }
                string word=s.substr(i,j-i);
                a.emplace_back(word);
                i=j;
            }
        }
        for(int i=size(a)-1;i>0;--i){
            ans=ans+a[i]+' ';
        }
        return ans+a[0];
    }
};

标签:string,int,反转,ans,字符串,2k,LeetCode,刷题
来源: https://blog.csdn.net/fudaodao/article/details/120301296

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有