LeetCode 344.反转字符串

题目描述

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

示例

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

题目链接

https://leetcode.cn/problems/reverse-string/description/

解题思路

双指针,左右两边进行交换

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

LeetCode 541. 反转字符串II

题目描述

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

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

示例

输入:s = "abcdefg", k = 2
输出:"bacdfeg"

题目链接

https://leetcode.cn/problems/reverse-string-ii/description/

解题思路

二刷还想半天,想的是在上一题基础上,先将字符串切割为指定内容,再对切割后的进行翻转。

实际上可以将字符串转为数组,再操作。

// 24m10s
class Solution {
    public String reverseStr(String s, int k) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i += 2 * k) {
            if (s.length() - i < k) {
                sb.append(reverseS(s.substring(i)));
                break;
            } else {
                sb.append(reverseS(s.substring(i, i + k)));
                if (s.length() - i < 2 * k) {
                    sb.append(s.substring(i + k));
                } else {
                    sb.append(s.substring(i + k, i + 2 * k));
                }
            }
        }
        return sb.toString();
    }
    public String reverseS(String str) {
        int left = 0, right = str.length() - 1;
        char[] s = str.toCharArray();
        while (left < right) {
            char temp = s[left];
            s[left] = s[right];
            s[right] = temp;
            left++;
            right--;
        }
        return new String(s);
    }
}

卡码网:54.替换数字

题目描述

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。
输入描述
输入一个字符串 s,s 仅包含小写字母和数字字符。
输出描述
打印一个新的字符串,其中每个数字字符都被替换为了number

示例

输入示例

a1b2c3

输出示例

anumberbnumbercnumber

题目链接

https://kamacoder.com/problempage.php?pid=1064

解题思路

  • 新建 stringBulider类,遇到数字就插入 number,否则插入字符。
  • 直接用正则匹配 str.replaceAll("\\d", number)一行代码。
  • 先遍历得到需要替换的数字个数,然后扩容数组,再从后往前插入
import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String str = scanner.next();//获取输入的字符串

        int length = str.length();
        //确定替换后的数组长度大小
        for(int i = 0; i < str.length(); i++){
            if(Character.isDigit(s.charAt(i))){
                length += 5;
            }
        }

        char[] ch = new char[length];//构建一个新数组,长度为扩容后的大小

        length--;//length在后面作数组下标, 所以要减1
        for(int i = str.length() - 1; i >= 0; i--){
            if(Character.isDigit(s.charAt(i))){//从后往前遍历, 如果是数字,则替换为number,注意替换的顺序是倒序,因为我们是倒序遍历的
                ch[length--] = 'r';
                ch[length--] = 'e';
                ch[length--] = 'b';
                ch[length--] = 'm';
                ch[length--] = 'u';
                ch[length--] = 'n';
            }else{//是字母则添加到新数组
                ch[length--] = str.charAt(i);
            }
        }
        System.out.println(ch);
    }
}
import java.util.*;
class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.next();
        StringBuilder ans = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (Character.isDigit(s.charAt(i))) {
                ans.append("number");
            } else {
                ans.append(s.charAt(i));
            }
        }
        System.out.println(ans.toString());
    }
}