找回密码
 立即注册
首页 业界区 科技 算法day07-字符串篇(1)

算法day07-字符串篇(1)

艾晓梅 昨天 10:23
目录


  • 344 反转字符串
  • 反转字符串II
  • 替换数字
一、反转字符串

344. 反转字符串 - 力扣(LeetCode)
1.png

  本题要求原地反转字符串,即不使用额外空间修改 char[] s 中的字符顺序。考虑使用双指针法:

  • 定义两个指针 left 和 right,分别指向字符串的两端;
  • 依次交换 s[left] 与 s[right],并将指针向中间靠拢(left++, right--);
  • 当两个指针相遇或交错时,说明反转完成。
  这种方式可以实现 原地反转,不需要额外空间,效率也很高。
  1. class Solution {
  2.     public void reverseString(char[] s) {
  3.         int left = 0, right = s.length-1;
  4.         while(left < right){
  5.             char tmp = s[left];
  6.             s[left] = s[right];
  7.             s[right] = tmp;
  8.             left++;
  9.             right--;
  10.         }
  11.     }
  12. }
  13. //时间复杂度:O(N)
  14. //空间复杂度:O(1)
复制代码
二、反转字符串II

  541. 反转字符串 II - 力扣(LeetCode)
2.png

   题目要求每隔 2k 个字符就反转前 k 个字符,剩下的部分按规则处理。可以直接对原字符串转为字符数组,在原地进行操作。

  • 每次以 i 为起点,步长为 2k,处理长度为 2k 的块;
  • 对每一块的前 k 个字符进行反转;
  • 为避免越界,右边界需取 Math.min(i + k - 1, s.length - 1);
  • 用双指针 left 和 right 进行字符交换,实现局部反转;
  • 最终将修改后的字符数组转回字符串返回。
  1. public String reverseStr(String s, int k) {
  2.         char[] arr = s.toCharArray();
  3.         for (int i = 0; i < arr.length; i += 2 * k) {
  4.             int left = i;
  5.             int right = Math.min(i + k - 1, arr.length - 1);
  6.             while (left < right) {
  7.                 char tmp = arr[left];
  8.                 arr[left++] = arr[right];
  9.                 arr[right--] = tmp;
  10.             }
  11.         }
  12.         return new String(arr);
  13. }
复制代码
三、替换数字

  54. 替换数字(第八期模拟笔试)
3.png

  
  遍历整个字符串,对于每个字符进行判断:

  • 如果是数字字符(如 '0'~'9'),就将其替换为 "number";
  • 如果是小写字母字符(如 'a'~'z'),就直接保留;
  • 最后将所有结果拼接为一个新的字符串返回。
[code]class Main{    public static void main(String[] args){        Scanner in = new Scanner(System.in);        String s = in.nextLine();        StringBuilder sb = new StringBuilder();        for(char c : s.toCharArray()){            if(c >='0' && c
您需要登录后才可以回帖 登录 | 立即注册