代码随想录算法训练营|第8天

本文介绍了三种关于字符串反转的问题及其解题思路,包括位运算实现反转、基于k的单词反转以及移除多余空格的处理。通过实例展示了代码实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.题目:344 反转字符串

解题思路:

 位运算:

s[i] ^= s[j];
s[j] ^= s[i];
s[i] ^= s[j];

代码实现

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++;
             i--;
        }
    }
}

补充


2.题目:541 反转字符串Ⅱ

解题思路:

     题目含义:  k=2 的话  abcde 变成 ba cde           

                                         abcdefg   变成ba cd   fe g     (不足2K时反转前K个 )         


代码实现

class Solution {
    public String reverseStr(String s, int k) {
        int n = s.length();
        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);
    }
}

补充

                                              


3.题目:151.翻转字符串里的单词

解题思路:

  1. 移除多余空格(使用双指针法来去移除空格)
  2. 将整个字符串反转
  3. 将每个单词反转

代码实现

class Solution {
    public String reverseWords(String s) {
         //源字符数组
        char[] initialArr = s.toCharArray();
        //新字符数组
        char[] newArr = new char[initialArr.length+1];//下面循环添加"单词 ",最终末尾的空格不会返回
        int newArrPos = 0;
        //i来进行整体对源字符数组从后往前遍历
        int i = initialArr.length-1;
        while(i>=0){
            while(i>=0 && initialArr[i] == ' '){i--;}  //跳过空格
            //此时i位置是边界或!=空格,先记录当前索引,之后的while用来确定单词的首字母的位置
            int right = i;
            while(i>=0 && initialArr[i] != ' '){i--;} 
            //指定区间单词取出(由于i为首字母的前一位,所以这里+1,),取出的每组末尾都带有一个空格
            for (int j = i+1; j <= right; j++) {
                newArr[newArrPos++] = initialArr[j];
                if(j == right){
                    newArr[newArrPos++] = ' ';//空格
                }
            }
        }
        //若是原始字符串没有单词,直接返回空字符串;若是有单词,返回0-末尾空格索引前范围的字符数组(转成String返回)
        if(newArrPos == 0){
            return "";
        }else{
            return new String(newArr,0,newArrPos-1);
        }

    }
}

补充

今日总结


  1. 需要重复观看,在反复一遍             
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值