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());
    }
}
                
            
评论