代码随想录 算法小白的第8天算法之旅 344反转字符串541 05 替换空格 151.翻转字符串里的单词

反转字符串

题目链接

https://leetcode.cn/problems/reverse-string/
在这里插入图片描述
这道题比较简单 由题可以知道 类似的题 翻转链表的方法都是一样的
采用双指针法 首尾各给一个指针! 然后一个往前移动 一个往后移动
他们交换首尾的元素即可

class Solution {
    public void reverseString(char[] s) {
          int i= 0;
          int j =s.length - 1;
          while( i< j){
              char  temp = s[i];
               s[i] = s[j];
             s[j] = temp;
             i++;
             j--;
          }
    }
}

反转字符串二

https://leetcode.cn/problems/reverse-string-ii/

在这里插入图片描述
这道题的解题思路

我一一分析

首先这道题和反转字符串最大的区别就是,它规定了条件 是2k 2k 为单位的 反转 满足2k 反转 前k个 然后判断尾数满足 大于k 还是小于 k

那么怎么去解决呢 我们知道遍历数组是 一个一个遍历的 i++ 也就是

那么这道题我们不能用i++去遍历 我们需要使用 i = i+2k 我们高中的时候学过 sin函数 三角函数 和 +2派 这样是一样的 很好理解
所以我们遍历 for循环 当然我们还需要一步 就是遍历之间 需要将string 转换成字符串 数组 别忘了
遍历完以后
我们是不是就需要判断条件了
我们仍然采用双指针的方法 , 来解决 问题 和第一题的 方法一样 定义 初始指针 start 和末尾指针
end end 指针需要去判断 我们原来的长度 和 start+ k-1 (start指针 最后再加上一个k的长度) 的大小
目的是判断最后的尾数 情况 是小于k 小于k 返回 原来的长度 大于k 返回 加上k的长度 然后反转

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替换空格

https://leetcode.cn/problems/ti-huan-kong-ge-lcof/
在这里插入图片描述
这道题我们直接 new 一个新的对象 然后 遇到空格 替换变成 %20 其他直接复制。

class Solution {
    public String replaceSpace(String s) {
        if(s ==null){
            return null;
        }//先判断为空的情况
        //单线程使用 StringBuilder 
          StringBuilder  yjh  = new StringBuilder(); 
          for(int i =0 ; i<s.length();i++){
              if(s.charAt(i) == ' '){ //判断是不是空的
                  yjh.append("%20");

              }else{
                  yjh.append(s.charAt(i));
              }
          }

          return yjh.toString();//使用toString方法 别忘记()

    }
}

151.翻转字符串里的单词

https://leetcode.cn/problems/reverse-words-in-a-string/
在这里插入图片描述
解题思路 有很多种

我这里写我理解的一种方法
先把首尾的空格还有中间多余的空格都去掉
然后反转整个字符串
再反转单独单词的字符串

class Solution {
    //用 char[] 来实现 String 的 removeExtraSpaces,reverse 操作
    public String reverseWords(String s) {
        char[] chars = s.toCharArray();
        //1.去除首尾以及中间多余空格
        chars = removeExtraSpaces(chars);
        //2.整个字符串反转
        reverse(chars, 0, chars.length - 1);
        //3.单词反转
        reverseEachWord(chars);
        return new String(chars);
    }

    //1.用 快慢指针 去除首尾以及中间多余空格,可参考数组元素移除的题解
    public char[] removeExtraSpaces(char[] chars) {
        int slow = 0;
        for (int fast = 0; fast < chars.length; fast++) {
            //先用 fast 移除所有空格
            if (chars[fast] != ' ') {
                //在用 slow 加空格。 除第一个单词外,单词末尾要加空格
                if (slow != 0)
                    chars[slow++] = ' ';
                //fast 遇到空格或遍历到字符串末尾,就证明遍历完一个单词了
                while (fast < chars.length && chars[fast] != ' ')
                    chars[slow++] = chars[fast++];
            }
        }
        //相当于 c++ 里的 resize()
        char[] newChars = new char[slow];
        System.arraycopy(chars, 0, newChars, 0, slow); 
        return newChars;
    }

    //双指针实现指定范围内字符串反转,可参考字符串反转题解
    public void reverse(char[] chars, int left, int right) {
        if (right >= chars.length) {
            System.out.println("set a wrong right");
            return;
        }
        while (left < right) {
            chars[left] ^= chars[right];
            chars[right] ^= chars[left];
            chars[left] ^= chars[right];
            left++;
            right--;
        }
    }

    //3.单词反转
    public void reverseEachWord(char[] chars) {
        int start = 0;
        //end <= s.length() 这里的 = ,是为了让 end 永远指向单词末尾后一个位置,这样 reverse 的实参更好设置
        for (int end = 0; end <= chars.length; end++) {
            // end 每次到单词末尾后的空格或串尾,开始反转单词
            if (end == chars.length || chars[end] == ' ') {
                reverse(chars, start, end - 1);
                start = end + 1;
            }
        }
    }
}

左旋转字符串

class Solution {
    public String reverseLeftWords(String s, int n) {
        char[] chars = s.toCharArray();
        reverse(chars, 0, chars.length - 1);
        reverse(chars, 0, chars.length - 1 - n);
        reverse(chars, chars.length - n, chars.length - 1);
        return new String(chars);
    }

    public void reverse(char[] chars, int left, int right) {
        while (left < right) {
            chars[left] ^= chars[right];
            chars[right] ^= chars[left];
            chars[left] ^= chars[right];
            left++;
            right--;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值