代码随想录Day08

反转字符串

这道题没什么,迄今为止遇到最简单的了吧
在这里插入图片描述

反转字符串II

这道题自己试了差不多1个小时多吧,想想真是可笑,刚开始觉得很简单,直接上手写了,但是发现条件老是露。想着边写边优化,没想到越写越乱,唉!!然后纸上画了一下,再写,还是没完全包含进去。。。好吧,还是太菜了,总有一天我会秒解这道题的!!!

  • String不可变。String 是引用类型数据,其值是无法改变,如果想要像C语言那样修改字符串那么只能通过StringBuilder类来操作字符串。StringBuilder是可变的。
class Solution {
    public String reverseStr(String s, int k) {
        int count;
        //感觉用双指针很合适
        int left = 0;
        int right = 0;
        char temp = 0;
        int i = 0;
        StringBuilder sb = new StringBuilder(s);

        //i是2k的整数倍
        while(i % (2*k) == 0 && i <= s.length()){
            if(i == 0){
                i += 2*k;
                continue;
            }
            left = i - 2*k;
            right = i - k -1;
            while(left < right){
                temp = sb.charAt(left);
                // s.charAt(left) = s.charAt(right);
                // s.charAt(right) = temp;   
                sb.setCharAt(left,sb.charAt(right));
                sb.setCharAt(right,temp);
                left ++;
                right --;     
            }
            i += 2*k;
        }
        //字符串长度小于k
        if(s.length() - i < k){
            left = 0;
            right = s.length() - 1;
            while(left < right){
                temp = s.charAt(left);
                 sb.setCharAt(left,s.charAt(right));
                sb.setCharAt(right,temp);  
                left ++;
                right --;     
            }
        }else{
            left = i;
            right = i + k - 1;
            while(left < right){
                temp = s.charAt(left);
                sb.setCharAt(left,s.charAt(right));
                sb.setCharAt(right,temp); 
                left ++;
                right --;     
            }
        }
        return s;

    }
}

先留着吧,等最后回头来做

替换空格

当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
另外还可以使用setlength
StringBuilder是线程不安全的,使用起来更快,一般都用这个。

import java.util.*;
public class Solution {
    public String replaceSpace(StringBuffer str) {
    	//先扩容--->扩容到空格数 * 占位数
        int count = 0;
        for(int i = 0;i < str.length();i++){
            if(str.charAt(i) == ' '){
                count++;
            }
        }
        //怎么扩充stringbuffer的长度呢?
        //扩充的char是应该按照空格放进去呢?还是按照空字符
        int left = str.length()-1 ;
        str.setLength(count * 3 +str.length());
        int right = str.length()-1 ;
        while(left >= 0 && left < right){
            if(str.charAt(left) == ' '){
                //怎么能一次性赋值三个字符串呢
                str.charAt(right) = '0';
                right --;
                str.charAt(right) = '2';
                right --;
                str.charAt(right) = '%';
                right --;
            }
            str.setCharAt(right,str.charAt(left));
        }
        return str.toString; 
    }
}

上面代码中的错误

  1. toString后面加()

修改后的代码:

import java.util.*;
public class Solution {
    public String replaceSpace(StringBuffer str) {
        if(str == null || str.length() ==0){
            return str.toString();
        }
    	//先扩容--->扩容到空格数 * 占位数
        int count = 0;
        for(int i = 0;i < str.length();i++){
            if(str.charAt(i) == ' '){
                count++;
            }
        }
        //怎么扩充stringbuffer的长度呢?
        //扩充的char是应该按照空格放进去呢?还是按照空字符
        int left = str.length()-1 ;
        str.setLength(count * 3 +str.length());
        int right = str.length()-1 ;
        while(left >= 0 && left < right){
            if(str.charAt(left) == ' '){
                //怎么能一次性赋值三个字符串呢
                str.setCharAt(right,'0');
                right --;
                str.setCharAt(right,'2');
                right --;
                str.setCharAt(right,'%');
                right --;
            }else{
            str.setCharAt(right--,str.charAt(left));
            }
            left--;
        }
        return str.toString();
    }
}

但是还是报错了:
在这里插入图片描述
目前不知道哪里错了~

今天搞了一晚上3道题也没搞完,唉,先这样吧。。。

胡汉三又回来啦!!!
下面是修改过的代码,其实就是count * 3那里写错了,应该是*2,因为,原来字符串里面的空格也是占了一个位置的

import java.util.*;
public class Solution {
    public String replaceSpace(StringBuffer str) {
        if(str == null || str.length() ==0){
            return str.toString();
        }
    	//先扩容--->扩容到空格数 * 占位数
        int count = 0;
        for(int i = 0;i < str.length();i++){
            if(str.charAt(i) == ' '){
                count++;
            }
        }
        //怎么扩充stringbuffer的长度呢?
        //扩充的char是应该按照空格放进去呢?还是按照空字符
        int left = str.length()-1 ;
        str.setLength(count * 2   +str.length());
        int right = str.length()-1 ;
        while(left >= 0 && left < right){
            if(str.charAt(left) == ' '){
                //怎么能一次性赋值三个字符串呢
                str.setCharAt(right,'0');
                right --;
                str.setCharAt(right,'2');
                right --;
                str.setCharAt(right,'%');
                right --;
            }else{
            str.setCharAt(right--,str.charAt(left));
            }
            left--;
            
        }
        return str.toString();
    }
}

翻转字符串里的单词

这道题又搞了1个多小时

  • 没搞明白为什么按照while那样写
  • String(chars) 和 stringbuilder.toString方法的不同使用

在这里插入图片描述

左旋转字符串

尝试手撕左旋转字符串(写到下面这的时候发现,前面num个字符被我已经赋值过了,如果先保留,我可能会开另一个数组存一下。看看题解吧~)

int start =0int end = start + num;(num表示要旋转多少个)
char temp = ' ';
char[] chars = str.toCharArray();
while(end < chars.length){
	temp =chars[start];
	chars[start] = chars[end];
	chars[end] = temp;
	end ++;
	start ++;
}

局部反转 + 全局反转的思路真的是绝了~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值