代码随想录第七天|反转字符串|反转字符串II |.替换数字|翻转字符串里的单词|右旋转字符串

这里首先附上java中字符串相关方法操作:

字符串s传字符数组arr:char[] arr=s.toCharArray();

字符数组arr转字符串s:new.String(arr);

stringbuilder sb转字符串: sb.toString();

双指针直接解决

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


    }
}

反转字符串II

这里注意右指针的边界条件

class Solution {
    public String reverseStr(String s, int k) {
        char[] arr=s.toCharArray();
        int len=arr.length;
        for(int i=0;i<len;){
            int l=i;
            int r=l+k-1;
            if(r<len){      //边界条件的判断
                reverse(arr,l,r);//也可int end = Math.min(ch.length - 1,start + k - 1);
            }else{
                r=len-1;
                reverse(arr,l,r);
            }
            i=i+2*k;
        }
        return new String(arr);
    }
    public void reverse(char[] arr,int m,int n){
        while(m<n){
                char temp;
                temp=arr[m];
                arr[m]=arr[n];
                arr[n]=temp;
                m++;
                n--;
            }
    }
}

替换数字

这题使用了java中character类中的isdigit方法进行数字的判断,后续需要了解里面是如何实现的。然后还使用了stringbuilder类

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        String s=in.nextLine();
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<s.length();i++){
            if(Character.isDigit(s.charAt(i))){
                sb.append("number");
            }else{
                sb.append(s.charAt(i));
            }
        }
        System.out.println(sb);
    }
}

翻转字符串里的单词

这题比较复杂,首先是要去除多余的空格,然后再将整个字符串进行反转,然后再对单个单词进行反转。

class Solution {
    public String reverseWords(String s) {
        StringBuilder sb=removespace(s);
        reverse(sb,0,sb.length()-1);
        reverseword(sb);
        return sb.toString();
    }
    public StringBuilder removespace(String s){
        StringBuilder sb=new StringBuilder();
        int l=0;
        int r=s.length()-1;
        while(s.charAt(l)==' ') l++;  //将前端的空格删除
        while(s.charAt(r)==' ') r--;  //将尾端的空格删除
        while(l<=r){  //边界条件注意
            char c=s.charAt(l);
            if(c!=' '||sb.charAt(sb.length()-1)!=' '){
                sb.append(c);
            }
            l++;
        }
        return sb;
    }
    public void reverse(StringBuilder sb,int l,int r){
        while(l<r){
            char temp=sb.charAt(l);;
            sb.setCharAt(l,sb.charAt(r));
            sb.setCharAt(r,temp);
            l++;
            r--;
        }
    }
    public void reverseword(StringBuilder sb){       
        for(int i=0;i<sb.length();i++){
            int slow=i;
            int fast=i+1;
            while(fast<sb.length()&&sb.charAt(fast)!=' '){
                fast++;
            }
            reverse(sb,slow,fast-1);
            i=fast;
        }

    }
}

右旋转字符串

将后面k个字符串先放入stringbuilder中,然后将剩余的再进行放入。这里要注意java中的输入输出该怎么写。这里是ACM模式,手动写输入输出,nextLine()表示读取输入中的下一行内容并将其作为字符串返回。nextInt()表示从输入中读取下一个整数。Integer.parseInt(str)表示将字符串转换为整数。

import java.util.Scanner;

class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        int k=Integer.parseInt(in.nextLine()) ;
        String s=in.nextLine();
        int len=s.length();
        if(k>=len){
            return;
        }
        StringBuilder sb=reverseright(s,k);
        System.out.println(sb);
    }
    public static StringBuilder reverseright(String s,int k){
        char[] arr=s.toCharArray();
        int len=arr.length;
        StringBuilder sb1=new StringBuilder();
        for(int i=len-k;i<len;i++){
            sb1.append(arr[i]);
        }
        for(int j=0;j<len-k;j++){
            sb1.append(arr[j]);
        }
        return sb1;
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值