day08-字符串01

文章探讨了如何使用双指针策略在Java中反转字符串,包括基本的逐个字符交换方法和更复杂的问题如反转字符串II,其中涉及每隔固定数量的字符进行反转。还提及了其他与字符串操作相关的编程练习,如替换数字、翻转单词和右旋转字符串,都运用了类似的逻辑和技巧。
摘要由CSDN通过智能技术生成
时刻要区分 字符串长度 与 字符串中字符下标        最右下标 为length-1 
344.反转字符串

思路:在反转链表中,使用了双指针的方法。

那么反转字符串依然是使用双指针的方法,只不过对于字符串的反转,其实要比链表简单一些。

对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。

 
class Solution {
    public void reverseString(char[] s) {
        //双指针
        int left = 0;
        int right = s.length - 1;
        while(left < right){
            char temp = s[right];
            s[right] = s[left];
            s[left] = temp;
            left++;
            right--;
        }
    }
}

 541. 反转字符串II

思路:先理解好题意,题意大致为        确立好末尾点

        每隔2k个反转k个,尾数不够k个时候全部反转。

        如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

同样为交换字符串还是用双指针,因要满足上述条件,每次操作元素都为2k个因此可以每2k个进行遍历,获得2k元素中的前k个找到交换起始结束 start,end开始交换

class Solution {
    public String reverseStr(String s, int k) {
        //题目意思是每隔2k个反转k个,尾数不够k个时候全部反转
        //每次处理字符串都是2k个 2k个遍历
        char[] ch = s.toCharArray();
        for(int i=0;i<ch.length; i += 2 * k){
            int start = i;
            //判断尾数够不够k个来取决end位置
            int end = Math.min(ch.length - 1,start + k - 1);
            while(start < end){
                //异或交换同理
                // ch[start] ^= ch[end];
                // ch[end] ^= ch[start];
                // ch[start] ^= ch[end];

                char temp = ch[end];
                ch[end] = ch[start];
                ch[start] = temp;

                start++;
                end--;
            }
        }
        return new String(ch);
    }
}

卡码网:54.替换数字 

import java.util.Scanner;

class Main{
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.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);
    }
}

 151.翻转字符串里的单词 

class Solution {
    /**
     * 不使用Java内置方法实现
     * <p>
     * 1.去除首尾以及中间多余空格
     * 2.反转整个字符串
     * 3.反转各个单词
     */
    public String reverseWords(String s) {
        //1.去除首尾以及中间多余空格
        StringBuilder sb = removeSpace(s);
        //2.反转整个字符串
        reverseString(sb,0,sb.length()-1);
        //3.反转各个单词
        reverseEachWord(sb);
        return sb.toString();
    }

    private 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;
    }

    private void reverseString(StringBuilder sb,int start,int end){
        while(start < end){
            char temp = sb.charAt(start);
            //将sb字符串起始位置字符替换成末尾位置字符
            sb.setCharAt(start,sb.charAt(end));
            sb.setCharAt(end,temp);
            end--;
            start++;
        }
    }

    private void reverseEachWord(StringBuilder sb){
        int start = 0;
        int end = 1;
        int n = sb.length();
        //从头开始找第一个倒序单词
        while(start < n){
            while(end < n && sb.charAt(end) != ' '){
                end++;
            }
            //当end移动到' '第一个倒序单词已经找到 调用字符串反转方法
            reverseString(sb,start,end-1);
            //start 为下一个倒序单词开始 
            start = end + 1;
            end = start + 1;
        }
    }
}

卡码网:55.右旋转字符串

思路:将字符串分成两段  length-n n 先通过 整体倒叙,再将两个段子串里的的字符在倒叙一把,负负得正,这样就不影响子串里面字符的顺序了。

import java.util.*;
class Main{
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();// int n = Integer.parseInt(in.nextLine());
        sc.nextLine(); // 消耗掉nextInt后的换行符
        String s = sc.nextLine(); // 现在这里能正确读取字符串了
        
        int len = s.length();
        char[] chars = s.toCharArray();
        reverseString(chars,0,len-1);
        reverseString(chars,0,n-1);
        reverseString(chars,n,len-1);
        
        System.out.println(chars);
    }
    
    private static void  reverseString(char[] chars,int start,int end){
        while(start < end){
            chars[start] ^= chars[end];
            chars[end] ^= chars[start];
            chars[start] ^= chars[end];
            
            start++;
            end--;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值