day07 字符串 344反转字符串 541反转字符串Ⅱ 54替换数字

344 反转字符串

和反转链表一样,也是用双指针法。定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。

class Solution {
    public void reverseString(char[] s) {
        int l = 0;
        int r = s.length -1;
        while(l<r){
            char temp = s[l];   //定义一个temp来存储中间值
            s[l] = s[r];
            s[r] = temp;
            l++;
            r--; 
        }
    }
}

541 反转字符串Ⅱ

上一题的升级版

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);  //将end定义为数组的长度和前k个字符的最小值
            while(start<end){
                char temp = ch[start];
                ch[start] = ch[end];
                ch[end] = temp;
                start++;
                end--; 
            }
        }
        return new String(ch);
    }
}

54替换数字

先预先给数组扩容到填充后的大小,然后再从后向前进行操作。实质上也是双指针法,i指向新长度的末尾,j指向旧长度的末尾。

import java.util.Scanner;
 
public class Main{
    public static String replace(String s){
        int count=0;
        int oldsize =s.length();
        for(int i=0; i<s.length();i++){
            if(Character.isDigit(s.charAt(i))){
                count++;
            }
        }
         
        // 扩充字符串s的大小,也就是每个空格替换成"number"之后的大小
        char[] newS = new char[s.length()+count*5];
        int newsize=newS.length;
        //将旧字符串的内容填入到新数组
        System.arraycopy(s.toCharArray(),0,newS,0,oldsize);
        // 从后先前将空格替换为"number"
        for(int i=newsize-1,j=oldsize-1;j<i;j--,i--){
            if(!Character.isDigit(newS[j])){
                newS[i]=newS[j];
            }else{
                newS[i]='r';
                newS[i-1]='e';
                newS[i-2]='b';
                newS[i-3]='m';
                newS[i-4]='u';
                newS[i-5]='n';
                i-=5;
            }
        }
        return new String(newS);
    }
     
    public static void main (String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();
        System.out.println(replace(s));
        scanner.close();/* code */
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值