Day07|String

344.反转字符串

初始思路&&题解复盘

class Solution {
    public void reverseString(char[] s) {
        /*有一种双指针的直觉*/
        int start = 0;
        int end = s.length-1;
        while(start<=end){
            char c = s[start];
            s[start] = s[end];
            s[end] = c;
            start++;
            end--;
        }


    }
}

很基础的题目,没什么好说的,跟题解的唯一区别在于我是start<=end,偶数时没有什么影响,奇数时start和end指针指向同一个元素并且交换的操作没什么意义,所以还是写为start<end比较好


541. 反转字符串II 

初始思路&&题解复盘

class Solution {
    public String reverseStr(String s, int k) {
        char[] c = s.toCharArray();
        int start = 0;
        int end = k-1;
        int n = s.length()/(2*k);//前面反转的次数
        int i = 0;
        while(n>0){
            while(start<=end){
                char temp = c[start];
                c[start] = c[end];
                c[end] = temp;
                start++;
                end--;
            }
            n--;
            i++;
            start = 2*k*i;
            end = start+k-1;

        }
        int res = s.length()%(2*k);//剩余字符的数目
        if(res<k){
        end = s.length()-1;
            while(start<=end){
                char temp = c[start];
                c[start] = c[end];
                c[end] = temp;
                start++;
                end--;
            }
        }else if(k<=res&&k<2*k){
            end = start+k-1;
            while(start<=end){
                char temp = c[start];
                c[start] = c[end];
                c[end] = temp;
                start++;
                end--;
            }
        }
        String s1 = new String(c);
        return s1;
    }    
}

我的方法跟随想录的标答思路是一样的,但标答更为精简,把很多判断合在一起了 

            // 判断尾数够不够k个来取决end指针的位置
            int end = Math.min(ch.length - 1,start + k - 1);

替换数字

初始思路:

import java.util.Scanner;

public class Main {
    
    public static String replaceNumber(String str) {

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            if('a'<= str.charAt(i)&&str.charAt(i)<='z'){
                sb.append(str.charAt(i));
            }else{
                sb.append("number");
            }

        }
        String strs = sb.toString();
        return strs;
        
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str = scanner.next();
        System.out.println(replaceNumber(str));
        scanner.close();
    }
}

被卡码网的写题格式困扰了很久。。。 

题解复盘:

import java.util.Scanner;

public class Main {
    
    public static String replaceNumber(String str) {
        int count = 0;
        int sOldSize = str.length();
        for (int i = 0; i < str.length(); i++) {
            if (Character.isDigit(str.charAt(i))) {  // 如果是数字字符
                count++;
            }
        }
        char[] newCharArray = new char[str.length() + count * 5];
        int sNewSize = newCharArray.length;
        System.arraycopy(str.toCharArray(), 0, newCharArray, 0, sOldSize);
        for (int i = sNewSize - 1, j = sOldSize - 1; j < i; j--, i--) {
            if (!Character.isDigit(newCharArray[j])) {
                newCharArray[i] = newCharArray[j];
            } else {
                newCharArray[i--] = 'r';
                newCharArray[i--] = 'e';
                newCharArray[i--] = 'b';
                newCharArray[i--] = 'm';
                newCharArray[i--] = 'u';
                newCharArray[i] = 'n';  // 在 for 循环条件内 i 还会再减去一次
            }
        }
        return new String(newCharArray);
    };
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str = scanner.next();
        System.out.println(replaceNumber(str));
        scanner.close();
    }
}

1.统计数字的数量,以计算新数组长度

2.将旧的字符数组拷贝到新的字符数组

3.i指向新长度的末尾,j指向旧长度的末尾。从旧数组从后往前,开始赋值到新数组,将s[j]赋值给s[i](旧赋给新),旧碰上数字,新往前移动并且倒着赋值rebmun

4.创建新的String返回

为什么从后往前?

从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素整体向后移动。

感觉这道题只是锻炼从后往前赋值的思想,这个题解感觉并不是很简便。


151.反转字符串中的单词

写不动了先看题解吧,太多题了。

  • 移除多余空格 :思路还挺巧妙地快指针不是空格的话就直接赋值给慢指针,快指针再次不是空格的时候,让慢指针后面加一个空格。
    public static char[] removeExtraSpaces(char[] chars) {
            int slow = 0;
            for(int fast=0;fast<chars.length;fast++){
                if(chars[fast]!=' '){
                    if(slow>0){chars[slow++]=' ';}//利用slow添加空格
                    while(fast<chars.length&&chars[fast]!=' ')
                    {chars[slow++]=chars[fast++];}
                }
            }
            //相当于 c++ 里的 resize()
            char[] newChars = new char[slow];
            System.arraycopy(chars, 0, newChars, 0, slow);
            return newChars;
        }

  • 将整个字符串反转
  • 将每个单词反转:end遇上空格,reverse之前,再让start=end+1;
    public static char[] reverseEachWord(char[] chars){
            int start = 0;
            for(int end = 0;end<chars.length;end++){
                if(chars[end]==' '){
                    chars = reverse(chars,start,end-1);
                    start = end+1;
                }
            }
            return chars;
        }


55.右旋字符串

初始思路&&题解复盘:

先整体逆转过来,然后再逆转前n个,和后length-n个

abcdefg--gfedcba--fgabcde

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //System.out.println("请输入向右旋转位数:");
        int n = sc.nextInt();
        //System.out.println("请输入要旋转的字符串:");
        String str = sc.next();

        System.out.println(right(n,str));
        sc.close();
    }
    public static String right(int n,String s){
        int start = 0;
        int end = s.length()-1;
        char[] c = s.toCharArray();
        //先进行整体反转
        while(start<end){
            char temp = c[start];
            c[start] = c[end];
            c[end] = temp;
            start++;
            end--;

        }
        //再反转前n个
        start = 0;
        end= n-1;
        while(start<end){
            char temp = c[start];
            c[start] = c[end];
            c[end] = temp;
            start++;
            end--;

        }
        start = n;
        end= c.length-1;
        while(start<end){
            char temp = c[start];
            c[start] = c[end];
            c[end] = temp;
            start++;
            end--;

        }
        String res = new String(c);
        return res;

    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值