代码随想录算法训练营第八天 _ 字符串_344.反转字符串、541. 反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、牛客网-左旋转字符串。

学习目标:

60天训练营打卡计划!

字符串实现!

学习内容:

344.反转字符串

  • 一个简单的双指针法带走!
class Solution {
    public void reverseString(char[] s) {
        int left = 0;
        int right = s.length - 1;

        while(left < right){
            char tmp = s[left];
            s[left] = s[right];
            s[right] = tmp;
            left++;
            right--;
        }    
    }
}

541. 反转字符串II

  • String和char的互换操作不熟悉。谨记!
    • char[] ch = s.toCharArray(); 可将String变为char。
    • new String(ch) 就可以返回String。
  • 本题做交换时的end只有两种情况:Math.min(ch.length - 1,start + k - 1);
    • 太妙了!
    • 剩余长度大于k时,要交换的长度为start + k - 1;否则为ch.length - 1。
class Solution {
    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        for(int i = 0;i < ch.length;i += 2 * k){
            int start = i;
            // 判断尾数够不够k个来取决end指针的位置
            int end = Math.min(ch.length - 1,start + k - 1);
            while(start < end){
                
                char temp = ch[start];
                ch[start] = ch[end];
                ch[end] = temp;

                start++;
                end--;
            }
        }
        return new String(ch);
    }
}

剑指Offer 05.替换空格

  • 新建字符串,将原字符串为空的位置直接替换。
  • 或者就是先新建一个字符串,再使用双指针法(感觉没有意义)。
class Solution {
public:
    string replaceSpace(string s) {
        // write code here
        string res = "";
        for(int i = 0 ; i < s.length() ; i++)
        {
            if(s.at(i) != ' ') 
            {
                res += s.at(i);
            }
            else res += "%20";
        }
        return res;
    }
};

151.翻转字符串里的单词

  • 好复杂,思路很清晰,但实现时需考虑很多要素。
    • 第一步:先对原字符串进行去空格的操作!— 双指针法
    • 第二步:对去空格后的字符进行全部翻转。 — 双指针法
    • 第三步: 找到空格的位置后,按单词再单独反转。 — 双指针法
  • 等周日再做一遍!!
class Solution {
    private char[] removeBlank(char[] ch){
        int slow = 0;
        for(int fast = 0; fast < ch.length; fast++){
            // 下一个单词进入该if,并给slow增加' '
            // fast直接跳过所有的空格
        	// slow自己补足空格
            if(ch[fast] != ' '){
                if(slow != 0)
                    ch[slow++] = ' ';
                    // 直到一个单词完全循环结束时才退出
                while(fast < ch.length && ch[fast] != ' ')
                    ch[slow++] = ch[fast++];
            }
        }
        // 当于 c++ 里的 resize()
        char[] newch = Arrays.copyOf(ch, slow);
        // char[] newch = new char[slow];
        // System.arraycopy(ch,0,newch,0,slow);
        return newch;
    }

    private void reverse(char[] ch ,int left ,int right){
        while(left < right){
            char temp = ch[left];
            ch[left] = ch[right];
            ch[right] = temp;
            left++;
            right--;
        }
    }

    public String reverseWords(String s) {
        int start = 0;
        char[] ch = removeBlank(s.toCharArray());

        reverse(ch ,0 , ch.length - 1);

        // 查找空格
        for(int end = 0; end <= ch.length; end++){
            // end 每次到单词末尾后的空格或串尾,开始反转单词
            if (end == ch.length || ch[end] == ' ') {
                reverse(ch, start, end - 1);
                start = end + 1;
            }
        }

        return new String(ch);
    }
}

牛客网 - 左旋转字符串

  • 和上述的151思路一致
  • 题目链接:https://www.nowcoder.com/questionTerminal/12d959b108cb42b1ab72cef4d36af5ec
  • 以n为界,分别对前后两段做翻转
  • 再对整个数组做翻转。
  • 我看之前的资源里并没有取余的操作,可是我这边必须要取一次余才可以通过。
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param n int整型 
     * @return string字符串
     */
    private String reverse(String str ,int left ,int right){
        char[] ch = str.toCharArray();
        while(left < right){
            char tmp = ch[left];
            ch[left] = ch[right];
            ch[right] = tmp;
            left++;
            right--;
        }
        return new String(ch);
    }

    public String LeftRotateString (String str, int n) {
        // write code here
        int size = str.length();
        if(str == " " || size == 0)
            return "";
        int t = n % size;

        String tmp1 = reverse(str ,0 ,size - 1);
        
        String tmp2 = reverse(tmp1 ,0 ,size - t - 1);

        String tmp3 = reverse(tmp2 ,size - t ,size - 1);    

        return tmp3;

    }
}

学习时间:

  • 下午三小时(一个151做了两个半小时),晚上50分钟(左旋转字符串),整理文档半小时
  • 12月13日复习,151中的删除多余的空格不是很熟悉!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值