替换空格

题目描述

image

思路

原地修改

适用于c++这种字符串可变的语言,可以直接使用双指针法

双指针法

先将原空间扩容至结果所需大小,然后两个指针分别指向旧的和新的的尾部,往前移动,遇到需要替换的则替换后加入,否则直接加入。

从前往后的话插入未知后面的内容都会移动,时间复杂度增大,故从后往前。

主要是学双指针法的思想,适合在c++里用

遍历法

就遍历,然后替换加入到StringBuilder中,然后转成字符串返回,不允许用StringBuilder就直接加

代码实现

class Solution {
    public String replaceSpace(String s) {
        StringBuilder result=new StringBuilder();
        char[]array=s.toCharArray();
        for(int i=0;i<array.length;i++){
            //注意是字符类型,别写成字符串了
            if(array[i] ==' '){
                result.append("%20");
            }else{
                result.append(array[i]);
            }
        }
        return result.toString();
    }
}

复杂度分析

时间复杂度

O(n)

空间复杂度

O(n)

反思不足

思路

本题限制很少,怎么做都可以,主要是积累api吧

java se

String类不熟悉

  • 创建时可传入数组,起始索引,终止索引以构建字符串

    new String(arrays,0,len);
    
  • charAt方法根据索引获取字符

    s.charAt(1);
    
  • replaceAll方法根据正则表达式用目标字符串替换

    s.replaceAll(" ","%20");
    
  • toCharArray方法转换为字符数组

    s.toCharArray();
    
  • length()获取长度

  • substring获取子字符串(注意是小写s)

    s.substring(0,s.length);
    

StringBuilder类不熟悉

  • append方法追加字符串

    s.append("%20");
    

左旋转字符串

题目描述

image

思路

切片+拼接

遍历法

根据有无对StringBuilder的限制又可分为两种

使用时可以通过取余简化代码

代码实现

切片+拼接

class Solution {
    public String reverseLeftWords(String s, int n) {
        return s.substring(n,s.length())+s.substring(0,n);
    }
}

遍历法

class Solution {
    public String reverseLeftWords(String s, int n) {
        StringBuilder result=new StringBuilder();
        for(int i=n;i<s.length()+n;i++){
            result.append(s.charAt(i%s.length()));
        }
        return result.toString();
    }
}

复杂度分析

时间复杂度

切片+拼接,O(n),字符串切片函数为线性时间复杂度

遍历,O(n)

空间复杂度

均为O(n),前者是切片子字符串所致,后者是辅助空间所致

反思不足

审题

一开始还以为是交换前n个和末n个字符串的位置。

貌似没有限制的话,那些取巧的现成api是可以用的,但是其时间复杂度之类的可能不如自己设计的