代码随想录leetcode刷题Day11-字符串

/*
344. 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
 */

/*
方法一:直接双指针,遍历数组
时间复杂度O(n)
空间复杂度O(1)
 */
class Solution {
    public void reverseString(char[] s) {
        if (s == null || s.length == 0){
            return;
        }
        int head = 0, end = s.length - 1;
        char temp;
        while (head < end){
            temp = s[head];
            s[head] = s[end];
            s[end] = temp;
            head++;
            end--;
        }
    }
}

//方法二:位运算符交换
class Solution1 {
    public void reverseString(char[] s) {
        if (s == null || s.length == 0){
            return;
        }
        int head = 0, end = s.length - 1;
        while (head < end){
            s[head] ^= s[end];
            s[end] ^= s[head];
            s[head] ^= s[end];
            head++;
            end--;
        }
    }
}

/*
541. 反转字符串 II
给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。

如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
 */

/*
方法:注意循环的控制条件+双指针
 */
class Solution {
    public String reverseStr(String s, int k) {
        char[] arr = s.toCharArray();//把字符串转换为数组
        for (int i = 0; i < arr.length; i += 2 * k) {//i每次循环增加2k
            int head = i;
            int end = Math.min(i + k - 1,arr.length - 1);//注意可能剩下的不够k个,注意此处取较小值
            while (head < end){
                arr[head] ^= arr[end];
                arr[end] ^= arr[head];
                arr[head] ^= arr[end];//使用异或运算交换元素
                head++;
                end--;
            }
        }
        return new String(arr);//用new String() 而不用Arrays.toString()(看源码,不是要的答案)
    }
}

/*
剑指 Offer 05. 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
 */

/*
方法一:使用StringBuffer类,对s进行遍历
时间复杂度:O(n),对数组进行遍历
空间复杂度:O(n),创建了一个StringBuffer对象
 */
class Solution {
    public String replaceSpace(String s) {
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) != ' '){//如果不是空格
                buffer.append(s.charAt(i));//就加入对应元素
            }else{
                buffer.append("%20");//否则就加入指定的字段
            }
        }
        return buffer.toString();//最后转为String输出
    }
}

/*
方法二:玩一下内部库函数
 */
class Solution1 {
    public String replaceSpace(String s) {
        String s1 = s.replaceAll(" ", "%20");
        return s1;
    }
}

/*
151. 反转字符串中的单词
你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。
返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
 */

//方法一:调用Java内部的API
class Solution {
    public String reverseWords(String s) {
        // 除去开头和末尾的空白字符
        s = s.trim();
        // 正则匹配连续的空白字符作为分隔符分割
        List<String> wordList = Arrays.asList(s.split("\\s+"));
        Collections.reverse(wordList);//将数组反转
        return String.join(" ", wordList);//使用String类的join方法
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值