代码随想录算法训练营第八天 | 344.反转字符串 、541. 反转字符串II、05.替换空格、151.翻转字符串里的单词、58-II.左旋转字符串

344.反转字符串

C++:

class Solution {
public:
    void reverseString(vector<char>& s) {
        for(int i=0,j=s.size()-1;i<(s.size()/2);i++,j--){
            /*
            if(s[i]>='A'&&s[i]<='Z') s[i]=(s[i]-'A')+'a';
            if(s[j]>='A'&&s[j]<='Z') s[j]=(s[j]-'A')+'a';*/
            swap(s[i],s[j]);
        }
    }
};

C#:

public class Solution {
    public void ReverseString(char[] s) {
        for(int i=0,j=s.Length-1;i<j;i++,j--){
            (s[i],s[j])=(s[j],s[i]);
        }
    }
}

 

541. 反转字符串II

541. Reverse String II

 C++:

注意reverse自带库开闭区间

class Solution {
public:
    void reverseTemp(string &s,int firstIndex,int secondIndex){
        for(int i=firstIndex,j=secondIndex;i<j;i++,j--){
            swap(s[i],s[j]);
        }
    }

    string reverseStr(string s, int k) {
        for(int i=0;i<s.size();i+=(2*k)){
            // 1. 每隔 2k 个字符的前 k 个字符进行反转
            // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
            if(i+k<=s.size())
                //reverse(s.begin()+i,s.begin()+i+k);
                reverseTemp(s,i,i+k-1);
            else
                // 3. 剩余字符少于 k 个,则将剩余字符全部反转。
                //reverse(s.begin()+i,s.end());
                reverseTemp(s,i,s.size()-1);
        }
        return s;
    }
};

 注意reverse自带库开闭区间【reverse(,)第二个空相当于长度】

class Solution {
public:
    string reverseStr(string s, int k) {
        for(int i=0;i<s.size();i+=(2*k)){
            // 1. 每隔 2k 个字符的前 k 个字符进行反转
            // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
            if(i+k<=s.size())
                reverse(s.begin()+i,s.begin()+i+k);//reverse(,)第二个空相当于长度
            else
                // 3. 剩余字符少于 k 个,则将剩余字符全部反转。
                reverse(s.begin()+i,s.end());
        }
        return s;
    }
};

C#:

需注意char[] arr转换成string

public class Solution {
    void ReverseStr1(char[]arr,int firstIndex,int secondIndex){
        for(int i=firstIndex,j=secondIndex;i<j;i++,j--){
            (arr[i],arr[j])=(arr[j],arr[i]);
        }
    }
    public string ReverseStr(string s, int k) {
        char[] arr=s.ToCharArray();
        // 1. 每隔 2k 个字符的前 k 个字符进行反转
        // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
        for(int i=0;i<arr.Length;i+=2*k){
            if(i+k<=s.Length)
                ReverseStr1(arr,i,i+k-1);
            else
                ReverseStr1(arr,i,arr.Length-1);
        }
        string s1=new string(arr);
        return s1;
    }
}

 05.替换空格

剑指 Offer 05. 替换空格 LCOF

C++:

temp: 

class Solution {
public:
    string replaceSpace(string s) {
        string temp="";
        for(int i=0;i<s.size();i++){
            if(s[i]!=' ')   temp+=s[i];
            else temp=temp+"%20";
        }
        return temp;
    }
};

s: 

class Solution {
public:
    string replaceSpace(string s) {
        int count=0;//统计空格的个数
        int sOldSize=s.size();
        for(int i=0;i<sOldSize;i++){
            if(s[i]==' ') count++;
        }
        //扩充字符串S的大小,也就是每个空格替换成
        s.resize(s.size()+count*2);
        int sNewSize=s.size();
        //i->new j->old
        for(int i=sNewSize-1,j=sOldSize-1;j<i;j--,i--){
            if(s[j]!=' ')
                s[i]=s[j];
            else{
                s[i]='0';
                s[i-1]='2';
                s[i-2]='%';
                i-=2;
            }
        }
        return s;
    }
};

C#:

public class Solution {
    public string ReplaceSpace(string arr) {
        int count=0;//统计空格的个数
        char[] s=arr.ToCharArray();
        int sOldSize=s.Length;
        for(int i=0;i<sOldSize;i++){
            if(s[i]==' ') count++;
        }
        //扩充字符串S的大小,也就是每个空格替换成
        //s.resize(s.Length+count*2);
        //s=Array.Resize(s,s.Length+count*2);
        char[] s2=new char[s.Length+count*2];
        for(int i=0;i<arr.Length;i++){ //遍历s数组,把该数组的元素全部赋值给s2数组
            s2[i]=s[i];
        }
        s=s2; //把临时数组赋值给原数组,这时原数组已经扩容


        int sNewSize=s.Length;
        //i->new j->old
        for(int i=sNewSize-1,j=sOldSize-1;j<i;j--,i--){
            if(s[j]!=' ')
                s[i]=s[j];
            else{
                s[i]='0';
                s[i-1]='2';
                s[i-2]='%';
                i-=2;
            }
        }
        string s1=new string(s);
        return s1;
    }
}

151.翻转字符串里的单词

151. Reverse Words in a String

C++:

注意这里的reverse 是自己定义的,不是自带库的reverse。

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]);
        }
    }

    void removeExtraSpace(string&s){
        int slow=0;
        for(int i=0;i<s.size();i++){
            if(s[i]!=' '){ //遇到非空格就处理,即删除所有空格
                //手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。
                if(slow!=0) s[slow++]=' ';
                while(i<s.size()&&s[i]!=' '){//补上该单词,遇到空格说明单词结束。
                    s[slow++]=s[i++];
                }
            }
        }
        s.resize(slow);
    }

    string reverseWords(string s) {
        removeExtraSpace(s);//去掉多余空格
        reverse(s,0,s.size()-1);
        int start=0;
        for(int i=0;i<=s.size();i++){
            if(i==s.size()||s[i]==' '){
                reverse(s,start,i-1);
                start=i+1;
            }
        }
        return s;
    }
};

58-II.左旋转字符串 

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

C++:

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        string temp="";
        int fast=0;int slow=0;
        while(n--){
            temp+=s[fast];
            fast++;
        }
        while(fast<s.size()){
            s[slow++]=s[fast];
            fast++;
        }
      
        while(slow<s.size()){
           /* for(int i=0;i<temp.size();i++){
                s[slow]=temp[i];
                slow++;
            }*/
            for(char c:temp)
                s[slow++]=c;
            
        }
        return s;
    }
};

 三转:

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        reverse(s.begin(), s.begin() + n);
        reverse(s.begin() + n, s.end());
        reverse(s.begin(), s.end());
        return s;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值