DAY8-双指针,字符串-344,541,54,151

很多时候不知道用哪个函数方法,我也太菜了。

344比较简单。

541:

public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        for(int i = 0;i<s.length();i+=2*k){
            int start=i;
            int end=Math.min(s.length()-1,start+k-1);
            while(start<end){
                char temp=0;
                temp=ch[start];
                ch[start]=ch[end];
                ch[end]=temp;
                end--;
                start++;
            }
        }
        return new String(ch);
}

54:

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        System.out.println(replace(s));
        sc.close();
    }

    public static String replace(String s){
        int len = s.length();
        for(int i = 0;i<s.length();i++){
            if(s.charAt(i)>='0'&&s.charAt(i)<='9'){
                len+=5;
            }
        }
        char[] ch = new char[len];
        for(int i=0;i<s.length();i++){
            ch[i]=s.charAt(i);
        }
        for(int i=s.length()-1,j=len-1;i>=0;i--){
            //int i = s.length-1;
            if(ch[i]>='0'&&ch[i]<='9'){
                ch[j--]='r';
                ch[j--]='e';
                ch[j--]='b';
                ch[j--]='m';
                ch[j--]='u';
                ch[j--]='n';
            }else{
                ch[j--]=ch[i];
            }
        }
        return new String(ch);
    }
}

搞了半天都不对,最后放在idea里单步调试发现了问题,把j定在for循环里,每次它都没有被更新。

过程1.先计算扩容后需要多少长度

2.定义一个新的字符数组把旧的赋值过去

3.定义两个指针,分别指向新旧的末尾,遍历旧数组,按需向新数组赋值。

其他方法:也可以用StringBuilder,也可以直接申请新数组,不用向里面先赋值,所有操作均在一次循环里完成。

151:有很多细节需要处理,还有一个小问题没解决,得进IDEA单步调试,明天再看

1.移除多余字符

2.反转字符串

3.反转每个单词

public String reverseWords(String s) {
        StringBuilder sb =removeSpace(s);
        reverseString(sb,0,sb.length()-1);
        reverseEachword(sb);
        return sb.toString();
    }
    public StringBuilder removeSpace(String s){
        int start = 0;
        int end=s.length()-1;
        while(s.charAt(start)==' ') start++;
        while(s.charAt(end)==' ') end--;
        StringBuilder sb = new StringBuilder();
        while(start<=end){
            char c = s.charAt(start);
            if(c!=' '||sb.charAt(sb.length()-1)!=' '){
                sb.append(c);
            }
            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));
            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++;
            }
            reverseString(sb,start,end-1);
            start=end+1;
            end=start+1;
        }
    }

自己刷题好慢呀,还是要坚持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值