【Leecode】代码随想录字符串篇day8(原地操作字符串)

反转字符串

class Solution {
    public void reverseString(char[] s) {
        int i = 0;
        int j = s.length - 1;
        for(; i < j; i++, j--)
        {
            char tmp = s[i];
            s[i] = s[j];
            s[j] = tmp;
        }
    }
}
  • 复杂度:时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 1 ) O(1) O(1)

  • 题目链接:k为区间反转
  • 我的解法:过于纠结区间划分是对应三种情况的尾区间的界定,还是一板一眼的界定2*k区间,逻辑混乱仅通过35用例
class Solution {
    public String reverseStr(String s, int k) {
        int len = s.length();
        if(len < k) return s;
        char[] str = s.toCharArray();
        int low = 0; int fast = 1;
        while(fast < len)
        {
            if(((low + 1) % k) == 0){
                int left = low - k + 1;int right = low;
            // System.out.print(left);
            // System.out.println(right);
                while(left < right)
                {
                    char c = str[left];
                    str[left] = str[right];
                    str[right] = c;
                    left++;
                    right--;
                }
                low = fast + 1;
                fast = low + k;
            }
            else
            {
                low++;
                fast++;
                if(fast < len) fast++;
                else break;
            }
        }
        System.out.print(low);
        System.out.println(fast);

        if(((low + 1) % k) == 0)
        {
            int left = low - k + 1;int right = low;
            // System.out.print(left);
            // System.out.println(right);
                while(left < right)
                {
                    char c = str[left];
                    str[left] = str[right];
                    str[right] = c;
                    left++;
                    right--;
                }
        }
    
        if(((low + 1) % k) > 0 && ((low + 1) % k) < k)
        {
                int left = low;
                if(low < k) left = 0;
                int right = len - 1;
                while(left < right)
                {
                    char c = str[left];
                    str[left] = str[right];
                    str[right] = c;
                    left++;
                    right--;
                }
        }
        return String.valueOf(str);
    }
}
  • 正确解法:
class Solution {
    public String reverseStr(String s, int k) {
        char[] str = s.toCharArray();
        for(int i = 0; i < str.length; i += 2*k)
        {
            //反转区间的start和end
            int start = i;
            int end = Math.min(i + k - 1, str.length - 1);

            while(start < end)
            {
                char c = str[start];
                str[start] = str[end];
                str[end] = c;
                start++;
                end--;
            }
        }

        return new String(str);
    }
}

只需要关注要反转的区间以及每次区间的起点按2*k移动即可。

  • 复杂度:时间复杂度 O ( k n ) O(kn) O(kn),空间复杂度 O ( 1 ) O(1) O(1)

替换字符串中字符

import java.util.*;
import java.io.*;

public class Main {
   
	public static void main(String[] args) {
   
		Scanner in = new Scanner(System.in);
		String string = in.nextLine();
		String str = "";
		for(int i = 0; i < string.length(); i++)
		{
		    char c = string.charAt(i);
		    if(c >= '0' && c <= '9') str += "number";
		    else str += c;
		    
		}
		System.out.println(str);
	}
}

  • 拓展解法:题目的原意据说是想在原地进行替换,java实现是 提前统计数字数量计算扩容大小,创建包含旧字符串的新字符串,双指针从后往前更改新数组
import java.util.*;
import java.io.*;

public class Main {
   
	public static void main(String[] args) {
   
		Scanner in = new Scanner(System.in);
		String string = in.nextLine();
		char[] str = string.toCharArray();
		int cnt = 0;
		for(int i = 0; i < string.length(); i++)
		{
		    if(str[i] >= '0' && str[i] <= '9')
		    cnt++;
		}
		char[] newStr = new char[str.length + cnt * 5];
		for(int i = 0, idx = 0; i < str.length; i++)
		{
		    newStr[idx++] = str[i];
		}
		int right = newStr.length - 1;
		int left = str.length - 1;
		while(left >= 0)
		{
		    if(newStr[left] >= '0' && newStr[left] <= '9') 
		    {   
		        newStr[right--] = 'r';
		        newStr[right--] = 'e';
		        newStr[right--] = 'b';
		        newStr[right--] = 'm';
		        newStr[right--] = 'u';
		        newStr[right--] = 'n';
		    }
		    else newStr[right--] = newStr[left];
		    left--;
		}
		System.out.println(new String(newStr));
	}
}

总结:
字符数组转字符串: String str = new String(charr)
字符串转字符数组: char[] = str.toCharArray()

  • 复杂度:时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n)
  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值