day08_反转字符串1&2_替换空格_反转字符串里的单词_左旋转字符串

力扣344.反转字符串

题目链接:https://leetcode.cn/problems/reverse-string/

完整代码

class Solution {
    public void reverseString(char[] s) {
        int left=0;
        int right=s.length-1;
        while(left<right){
            char temp=s[left];
            s[left]=s[right];
            s[right]=temp;
            left++;
            right--;
        }
    }
}

力扣541.反转字符串2

题目链接:https://leetcode.cn/problems/reverse-string-ii/

思路

刚开始想的时候,总想弄个计数器算下要反转几次。实际上定义start,每次跳2*k格,再定义end判断后面的元素够不够反转的。仔细理解一下start+k-1,如果k=2,end就在start+1位置;如果k=3,end就在start+2位置。都处在反转范围内,不在范围内的就不会进行操作。

完整代码

class Solution {
    public String reverseStr(String s, int k) {
        char[] ch=s.toCharArray();
        for(int i=0;i<ch.length;i+=2*k){
            int start=i;
            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);
    }
}

剑指offer05.替换空格

题目链接:https://leetcode.cn/problems/ti-huan-kong-ge-lcof/

思路

1.首先扩充原字符串大小。遇到一个空格,添加两个大小,这样s+=str.toString()后,原来一个空格的大小扩充成可以替换为‘%20’的大小。

2.定义一个left,指向原字符串末尾。再定义一个right,指向扩充后的字符串末尾。从后往前走,当left遇到空格时需要替换了,就让right=0,right-1=2,right-2=%。没遇上空格时不需要替换,直接把left的值赋给right。

3.为什么要从后往前走?

1.不用申请新数组。
2.如果从前往后走,在添加元素之后的每个元素都需要向后移,时间复杂度为O(n2)。

完整代码

class Solution {
    public String replaceSpace(String s) {
        StringBuilder str=new StringBuilder();
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)==' '){
                str.append("  ");
            }
        }
        if(str.length()==0) return s;//没有空格,返回原字符串
        int left=s.length()-1;
        s+=str.toString();
        int right=s.length()-1;
        char[] ch=s.toCharArray();
        while(left>=0){
            if(ch[left]==' '){
                ch[right--]='0';
                ch[right--]='2';
                ch[right]='%';
            }else{
                ch[right]=ch[left];
            }
            left--;
            right--;
        }
        return new String(ch);
    }
}

知识点

char与string的区别

1.char是基本的数据类型,string是一个类。这是二者本质的区别。

2.char表示字符,定义时使用单引号,只可以存储一个字符。

3.String表示字符串,定义时使用双引号,可以存储一个或多个字符。

从string获取char

1.通过下标索引

String s="今天是周一!";
char ch=s.charAt(0);

2.在数组中,用一种方法也可以做到。使用String.toCharArray()(返回值为char[])可以得到将包含整个String的char数组。这样我们就能够使用从0开始的位置索引来访问string中的任意位置的元素。

char转换为string

String s = String.valueOf('c'); //效率最高的方法 
String s = String.valueOf(new char[]{'c'}); //将一个char数组转换成String String s = Character.toString('c'); // Character.toString(char)方法实际上直接返回String.valueOf(char) 
String s = new Character('c').toString(); 
String s = "" + 'c'; // 虽然这个方法很简单,但这是效率最低的方法 
// Java中的String Object的值实际上是不可变的,是一个final的变量。 
// 所以我们每次对String做出任何改变,都是初始化了一个全新的String Object并将原来的变量指向了这个新String。 
// 而Java对使用+运算符处理String相加进行了方法重载。 

// 字符串直接相加连接实际上调用了如下方法: 
// new StringBuilder().append("").append('c').toString(); 
String s = new String(new char[]{'c'});

StringBuilder类

StringBuilder是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是StringBuilder对象中的内容是可变的。

常用方法

StringBuilder sb = new StringBuilder();
// 对象名.length() 序列长度
System.out.println(sb.length());  // 0
// 对象名.append() 追加到序列
sb.append("hello");
System.out.println(sb);  // hello
// 97代表的是是'a'
sb.appendCodePoint(97);
System.out.println(sb);  // helloa
// 链式编程
sb.append(1).append("world").append(2);
System.out.println(sb);  // helloa1world2
// 索引是5的位置替换成空格
sb.setCharAt(5, ' ');
System.out.println(sb);  // hello 1world2
// 指定位置0前插入0
sb.insert(0, 0);
System.out.println(sb);  // 0hello 1world2
// 删除索引6(包含)至索引14(不包含)的字符串
sb.delete(6, 14);
System.out.println(sb);  // 0hello
// StringBuilder类型转换成String类型
String s = sb.toString();
System.out.println(s);  // 0hello

// 以及还有截取、反转、替换等方法

String和StringBuilder的区别

1.String内容是不可变的,StringBuilder内容是可变的。

2.StringBuilder处理字符串性能比String好。

String和StringBuilder的相互转换

// string转换成StringBuilder
String str = "hello";
StringBuilder sb = new StringBuilder(str);
System.out.println(sb);  // hello
// StringBuilder转换成String
String s = sb.toString();
System.out.println(s);  // hello

力扣151.反转字符串中的单词

题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/

思路

1.先删除字符串中多余的空格,即删除除单词之间的一个空格之外的全部空格。

2.将字符串中的所有字母反转。

3.再将单个单词的字母反转。这样,就达到了反转字符串中的单词的目的。

完整代码

class Solution {
    public String reverseWords(String s) {
        StringBuilder sb=new StringBuilder();
        sb = removeExtraSpace(s);
        reverseString(sb,0,sb.length()-1);
        reverseEachWord(sb);
        return sb.toString();
    }
	//移除多余空格
    public StringBuilder removeExtraSpace(String s){
        int start=0;
        int end=s.length()-1;
        while(s.charAt(start)==' ') start++;//让start移到第一个字母出现的位置
        while(s.charAt(end)==' ') end--;//让end移到最后一个字母出现的位置
        StringBuilder sb=new StringBuilder();
        while(start<=end){//当start=end时,即遍历到最后一个字母,是需要加入这个元素的,所以取<=
            char ch=s.charAt(start);
            if(ch!=' '||sb.charAt(sb.length()-1)!=' '){//遍历到字母或者sb末尾不是空格,加入元素。如果遍历到空格然而sb末尾已是空格,则不加。
                sb.append(ch);
            }
            start++;
        }
        return sb;
    }
	//反转字符串
    public void reverseString(StringBuilder sb, int start, int end) {
        while (start < end) {
            char temp = sb.charAt(start);
            sb.setCharAt(start, sb.charAt(end));//setCharAt(i,j):给字符串i位置赋值j
            sb.setCharAt(end, temp);
            start++;
            end--;
        }
    }
	//反转各单词
    public void reverseEachWord(StringBuilder sb){
        int start=0;
        int end=1;
        int n=sb.length();
        while(start<n){
            while(end<n&&sb.charAt(end)!=' '){//让end指向空格处
                end++;
            }
            reverseString(sb,start,end-1);//要反转的单词起始位置为start,终止位置为end-1,即空格前一位
            start=end+1;
            end=start+1;
        }
    }
}

剑指offer58.左旋转字符串

题目链接:https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/

思路

1.例如"abcdefg",n=2。先反转整个字符串,得到"gfedcba"。

2.再反转下标0到len-1-n的元素,得到"cdefgba"。

3.最后反转下标len-n到len-1的元素,得到"cdefgab"。

4.自己实现的时候忘记定义StringBuilder类了。要记住字符串s是不可变的,要修改就要定义StringBuilder类。

完整代码

class Solution {
    public String reverseLeftWords(String s, int n) {
        StringBuilder sb=new StringBuilder(s);
        int len=s.length();
        reverse(sb,0,len-1);
        reverse(sb,0,len-1-n);
        reverse(sb,len-n,len-1);
        return sb.toString();
    }
    public void reverse(StringBuilder sb,int start,int end){
        while (start < end) {
            char temp = sb.charAt(start);
            sb.setCharAt(start, sb.charAt(end));//setCharAt(i,j):给字符串i位置赋值j
            sb.setCharAt(end, temp);
            start++;
            end--;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值