欢迎光临
我们一直在努力

字符串算法基础1

Leetcode344反转字符串

这道题挺简单的

双指针初始化:定义左指针 left 指向列表第一个元素(索引 0),右指针 right 指向列表最后一个元素(索引len(s)-1)。

相向交换元素:在 left < right 的条件下,循环交换 left 和 right 指针指向的元素(用临时变量 tmp 暂存值完成交换)。

指针移动收敛:每次交换后,左指针右移一位(left += 1),右指针左移一位(right -= 1),直到两指针相遇 / 交叉(left >= right),此时列表已完全反转。

class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
left=0
right=len(s)-1
while left<right:
tmp=s[left]
s[left]=s[right]
s[right]=tmp
left=left+1
right=right-1

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

Leetcode541反转字符串2

这道题就是比反转字符串多了一点需要判断的地方,思路不难但是语法上有一些遗忘的地方

核心需求是:修改字符串中的部分字符,且要 “原地” 修改(避免额外内存开销)。

而 String 的不可变性导致:

  • 无法直接修改某一位置的字符;
  • 若通过拼接 / 替换的方式修改,会创建大量新字符串,不符合 “原地修改” 的设计要求;
  • 字符数组(char[])是可变的,可以通过索引直接修改任意位置的字符(比如 ch[0] = 'x'),且修改的是原数组内容,没有额外内存开销。
  • Java代码

    class Solution {
    public String reverseStr(String s, int k) {
    // 转为字符数组
    char[] ch = s.toCharArray();
    int len = ch.length;

    // 每2k个字符为一个处理单元,步进2k
    for (int i = 0; i < len; i += 2 * k) {
    // 确定反转的结束位置:
    // 1. 剩余字符不足k个:结束位置为最后一个字符(len-1)
    // 2. 剩余字符>=k个:结束位置为i+k-1
    int end = Math.min(i + k – 1, len – 1);
    // 反转[i, end]区间的字符
    reverse(ch, i, end);
    }

    // 字符数组转回字符串
    return new String(ch);
    }

    // 辅助方法:反转字符数组中[start, end]区间的字符
    private void reverse(char[] ch, int start, int end) {
    // 双指针法反转区间内字符
    while (start < end) {
    char tmp = ch[start];
    ch[start] = ch[end];
    ch[end] = tmp;
    start++;
    end–;
    }
    }
    }

    语法细节

    1.Java中的toCharArray String.toCharArray()

    作用:把字符串的每个字符拆成一个 char 类型的数组,返回这个数组。

    String s = "abc";
    char[] ch = s.toCharArray();
    System.out.println(ch[0]); // 输出 'a'
    System.out.println(ch.length); // 输出 3

    toCharArray() 是 String 类专属 的方法,作用是 “把字符串拆成 char[] 字符数组”;toArray() 是 Collection 集合接口(List/Set 等)专属 的方法,作用是 “把集合转成对象数组”;

    2.为什么辅助函数不需要返回值

    对于 int/char 这类基本类型:方法接收的是 “值的拷贝”,方法内修改不会影响原变量。

    对于数组 / 对象这类引用类型:方法接收的是 “内存地址的拷贝”,但这个地址指向的是同一个数组对象。本质是直接修改原数组的内容,因此无需返回新数组,方法执行后原数组已经是反转后的状态。

    3.Math.min

    • 本质:就是一个 “比较两个数,返回更小值” 的工具方法,底层用三元运算符实现,没有复杂逻辑。
    • 特点:静态方法,直接通过 Math.min(参数1, 参数2) 调用,无需创建 Math 对象。

    4.字符数组转回字符串

    char[] ch = {'a','b','c'};
    String s = new String(ch);
    ch[0] = 'x'; // 修改原数组
    System.out.println(s); // 仍输出 "abc"(String 不受影响)

    Python代码

    class Solution:
    def reverseStr(self, s: str, k: int) -> str:
    # 将字符串转为列表(Python中字符串不可变,列表可修改)
    s_list = list(s)
    n = len(s_list)

    # 每2k个字符为一个区间,步进2k
    for i in range(0, n, 2 * k):
    # 确定反转的结束位置:取 i+k-1 和 n-1 中较小的那个(等价于Java的Math.min)
    end = min(i + k – 1, n – 1)
    # 双指针反转 [i, end] 区间的字符
    left, right = i, end
    while left < right:
    s_list[left], s_list[right] = s_list[right], s_list[left]
    left += 1
    right -= 1

    # 将修改后的列表转回字符串
    return ''.join(s_list)

    语法细节

    字符串转列表

    为什么转列表不转数组,可以看我的数组基础那篇文章

    s_list = list(s) # 比如 s="abc" → s_list = ['a','b','c']

    pyhton的交换元素代码比较简洁

    s_list[left], s_list[right] = s_list[right], s_list[left]

    列表转回字符串

    Python 用 ''.join(列表) 把字符列表拼接成字符串,是列表转字符串的标准方式:

    return ''.join(s_list) # 比如 ['b','a','c'] → "bac"

    赞(0)
    未经允许不得转载:171主机测评 » 字符串算法基础1
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址