字符串相关题目汇总1

文章介绍了几种Java中处理字符串的方法,包括使用字符数组反转字符串,利用异或操作交换字符,处理字符串中的空格替换以及反向输出单词。还讨论了在处理字符串时可能遇到的陷阱,如空格处理和单词边界问题。
摘要由CSDN通过智能技术生成

image-20230517185703686

这道题意思是让字符数组逆序输出,通过第一个和倒数第一个,第二个和倒数第二个进行交换,以此类推……

public class Q344 {

    public void reverseString(char[] s) {
        int len = s.length;
        int mid = len / 2;
        for(int i = 0; i < mid; i++){
            char temp = s[i];
            s[i] = s[len - i - 1];
            s[len-i-1] = temp;
         }
    }

}

方法法二:通过异或的性质来进行交换。 a ^ 0 = a ; a ^ 1 = ~a

public class Q344_2 {

    public void reverseString(char[] s) {
        int left  = 0, right = s.length - 1;
        // 假设s[left] 为 a, s[right]  为b
        while(left < right){
            s[left] ^= s[right];  // s[left] = a ^ b
            s[right] ^= s[left];  // s[right] = b ^ a ^ b = a
            s[left] ^= s[right];  // s[left] = a ^ b ^ a = b
            left ++;
            right --;
        }
    }

}

image-20230517193409340

硬生生把一道简单题做成了复杂题,分享下自己代码

public class Q541 {

    public String reverseStr(String s, int k) {
        if(s.length() < k)
            return reverseString(s);
        StringBuilder res = new StringBuilder();
        int times = s.length() / (k * 2); // 可以循环几次
        int remainder = s.length() - times * k * 2;  // 不能整除2 * k的余数
        for(int i = 0; i < times; i++){
            int reverseLeft = 2 * k * i, reverseRight = (2 * i + 1) * k;
            int noReverseLeft = (2 * i + 1) * k, noReverseRight = 2 * (i + 1) * k;
            res.append(reverseString(s.substring(reverseLeft,reverseRight)));
            res.append(s.substring(noReverseLeft,noReverseRight));
        }
        if(remainder <= k)
            res.append(reverseString(s.substring(times * 2 * k)));
        else{
            res.append(reverseString(s.substring(times * 2 * k,s.length() - remainder + k)));
            res.append(s.substring(s.length()-remainder + k));
        }
        return res.toString();
    }

    public String reverseString(String s){
        StringBuilder res = new StringBuilder();
        for(int i = s.length() - 1; i >= 0; i--)
            res.append(s.charAt(i));
        return res.toString();
    }
}

方法二:官方题解,看完发现自己真笨啊Leetcode官方题解

public class Q541_2 {

    public String reverseStr(String s, int k) {

        int len = s.length();
        char[] arr = s.toCharArray();
        for(int i = 0; i < len; i += 2 * k){
            reverseString(arr, i, Math.min(i + k, len)-1);
        }
        return new String(arr);

    }

    public void reverseString(char[] arr, int left, int right){
        while(left < right){
            arr[left] ^= arr[right];
            arr[right] ^= arr[left];
            arr[left] ^= arr[right];
            left++;
            right--;
        }
    }
}

image-20230517194341385

看到字符串替换的题,首先想到java 字符串内置了替换(replace)的方法,因此尝试使用正则表达式来进行替换,代码如下:

public class Offer05 {
    public String replaceSpace(String s) {
        if(s == null || s.length() == 0)
            return s;
        String reg = "\\s";
        String res = s.replaceAll(reg,"%20");
        return res;
    }
}

方法二:一个字符一个字符进行比较,不是空格则添加该字符,是空格则添加%20

public class Offer05 {
    public String replaceSpace(String s) {
        if(s == null || s.length() == 0)
            return s;
        String reg = "\\s";
        String res = s.replaceAll(reg,"%20");
        return res;
    }
}

image-20230517200333981

这道题有一个陷阱,就是单词之间至少有一个空格,假设s = “hello world”; 如果直接使用s.split(“ ”),会出现如下结果

image-20230517200650613

正确的做法是使用s.split(“//s+”),结果如下图所示

image-20230517200833842

方法一:java内置方法

public class Q151 {

    public String reverseWords(String s) {
        String reg = "\\s+";
        String[] arr = s.trim().split(reg);
        StringBuilder res = new StringBuilder();
        for(int i = arr.length - 1; i >= 0; i--){
            res.append(arr[i]);
            res.append(" ");
        }
        return res.toString().trim();

    }

    public static void main(String[] args) {
        String s = "the sky is blue";
        String res = new Q151().reverseWords(s);
        System.out.println(res);
    }
}

方法二:循环遍历

public class Q151_2 {

    public String reverseWords(String s) {
       s.trim();// 删除收尾空格
        int j = s.length() - 1;
        int i = j;
        StringBuilder res = new StringBuilder();
        while(i >= 0){
            while(i >= 0 && s.charAt(i) != ' ')
                i--;
            // 添加单词
            res.append(s.substring(i + 1, j + 1) + " ");
            //跳过单词中的空格
            while(i>= 0 && s.charAt(i) == ' ')
                i--;
            j = i; // 指向下一个单词的末尾
        }
        return res.toString().trim();

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值