算法练习 Day8 | leetcode 344.反转字符串,541. 反转字符串II,替换数字,151.翻转字符串里的单词

一、算法题

344.反转字符串

题目链接

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. 反转字符串II

题目链接

class Solution {
    public String reverseStr(String s, int k) {
        char[] res=s.toCharArray();
        for(int i=0;i<res.length;i+=2*k){
            int start=i;
            int reslens=res.length-1;
            int lens=start+k-1;
            int end=Math.min(reslens,lens);
            while(start<end){
                char temp=res[start];
                res[start]=res[end];
                res[end]=temp;
                start++;
                end--;
            }
        }
        return new String(res);
    }
}
  • 发现 i 是成段成段跳的时候没必要一直 i++,可以根据跳的长度来修改 i
  • toCharArray()是将一个字符串内容转换为字符数组
    • 不会把结束符搞进来
  • 每次end的确定就是在下一次2k长度的末尾和字符数组末尾之间作比较,如果start+k-1>res.length-1,说明此时剩余字符小于2k但是大于k个
  • (不是很理解)

替换数字

题目链接

import java.util.Scanner;

class Main{
public static void main (String[] args) {
    /* code */
    Scanner in=new Scanner(System.in);
    String s=in.nextLine();
    StringBuilder sn=new StringBuilder();
    for(int i=0;i<s.length();i++){
        if(Character.isDigit(s.charAt(i))){
            sn.append("number");
        }else{
            sn.append(s.charAt(i));
        }
    }
    System.out.println(sn);
}
    
}
  • StringBuild
    • 常用方法:
      • public StringBuilder append(Object obj)  :添加数据,并返回对象本身

        public StringBuilder reverse() :返回相反的字符序列

    • 与String的区别:

      • String类:内容是不可变的

        StringBuilder类:内容是可变的

  • 使用Character类的isDigit()方法判断字符是否为数字,根据ascii码表将字符类型ch转换为int类型并传给Character类中的isDigit,通过查阅ascii码表知道 ‘0’-‘9’字符对应整数区间为48—57。

 

151.翻转字符串里的单词

题目链接

class Solution {
    public String reverseWords(String s) {
      //去除多余空格
      StringBuilder sb=removespace(s);
      //翻转整个
      reverseall(sb,0,sb.length()-1);
      //翻转每个单词
      reverseeach(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);
        //执行到sb.charAt(sb.length()-1)!=' '这里时
        //说明c=' ',如果新的字符串sb的末尾不为' ',说明到了一个单词的末尾,要给它加上一个空格
        //当两个条件都不满足时,说明c=' '且新字符串sb末尾已经有空格了,此时是单词中间有多余空格的情况
        if(c!=' '||sb.charAt(sb.length()-1)!=' '){
          sb.append(c);
        }
        start++;
      }
      return sb;
    }

    public void reverseall(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 reverseeach(StringBuilder sb){
      int start=0;
      int end =1;
      int n=sb.length();
      while(start<n){
        while(end<n&&sb.charAt(end)!=' '){
          //找到第一个单词的全部字母
          end++;
        }
        //找到了第一个单词
        reverseall(sb, start, end-1);
        start=end+1;
        end=start+1;
      }
    }
}

右旋字符串

题目链接

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = Integer.parseInt(in.nextLine());
        String s = in.nextLine();
        
        char res[]=s.toCharArray();
        int lens=s.length();
        
        //翻转全部字符串
        reversestring(res,0,lens-1);
        //翻转前n部分字符串
        reversestring(res,0,n-1);
        //翻转后面的字符串
        reversestring(res,n,lens-1);
        
        System.out.println(res);
        
        
    }
    
    public static void reversestring(char[] ch,int start,int end){
        while(start<=end){
            char temp=ch[start];
            ch[start]=ch[end];
            ch[end]=temp;
            start++;
            end--;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值