ReverseString

本文分享了LeetCode上字符串反转题目的多种解决方案,包括使用StringBuilder、递归及字符数组交换等方法,并对比了不同方法的优劣。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

今天第一次刷leetcode的题啊,最简单的一题,就出现超时不通过╮(╯▽╰)╭

题目如下:

Write a function that takes a string as input and returns the string reversed.

Example:
Given s = "hello", return "olleh".

 

 

我写的代码是:(真的是最笨的方法╮(╯▽╰)╭)

public static String reverseString(String s) {
        char[] arrs = s.toCharArray();
        String result = "";
        for (int i = (arrs.length - 1); i >= 0; i--) {
            result = result + arrs[i];
        }
        return result;
}

提交以后,超时啊~~

public String reverseString(String s) {
        if(s == null) return null;
        if(s.equals("")) return s;
        char[] arrChar = s.toCharArray();
        for (int i = 0, j = arrChar.length-1; i <= j; i++, j--) {
            char temp = arrChar[i];
            arrChar[i] = arrChar[j];
            arrChar[j] = temp;
        }
        return new String(arrChar);
 }

看了别人的讨论,如下几种方法 Many acceptable answers

Cheating Method using StringBuilder

public class Solution {
    public String reverseString(String s) {
        return  new StringBuilder(s).reverse().toString();
    }
}

 

 Classic Method by swapping first and last

public class Solution {
    public String reverseString(String s) {
        char[] word = s.toCharArray();
        int i = 0;
        int j = s.length() - 1;
        while (i < j) {
            char temp = word[i];
            word[i] = word[j];
            word[j] = temp;
            i++;
            j--;
        }
        return new String(word);
    }
}

 

 Same as previous but using byte instead

public class Solution {
    public String reverseString(String s) {
        byte[] bytes = s.getBytes();
        int i = 0;
        int j = s.length() - 1;
        while (i < j) {
            byte temp = bytes[i];
            bytes[i] = bytes[j];
            bytes[j] = temp;
            i++;
            j--;
        }
        return new String(bytes);
    }
}

Classic Method by swapping first and last
If you don't like temp variable

public class Solution {
    public String reverseString(String s) {
        byte[] bytes = s.getBytes();
        int i = 0;
        int j = s.length() - 1;
        while (i < j) {
            bytes[i] = (byte)(bytes[i] ^ bytes[j]);
            bytes[j] = (byte)(bytes[i] ^ bytes[j]);
            bytes[i] = (byte)(bytes[i] ^ bytes[j]);
            i++;
            j--;
        }
        return new String(bytes);
    }
}

 

Using recursion

public class Solution {
    public String reverseString(String s) {
        int length = s.length();
        if (length <= 1) return s;
        String leftStr = s.substring(0, length / 2);
        String rightStr = s.substring(length / 2, length);
        return reverseString(rightStr) + reverseString(leftStr);
    }
}

 

 

脑子短路ing

 

转载于:https://www.cnblogs.com/yiruparadise/p/5674983.html

<think>好的,我现在需要帮用户解答关于reverseString函数的问题。用户之前已经问过如何用for循环实现字符串反转,现在可能想更深入了解这个函数的具体细节或者实现原理。 首先,我要回顾之前的对话,用户给出的示例代码是用C语言写的,里面有一个reverseString函数,通过for循环交换字符来实现反转。用户现在直接提到reverseString,可能想知道这个函数的工作机制,或者有其他相关问题,比如不同的实现方法、优化、错误处理等。 接下来,我需要分析用户的需求。用户可能是在学习字符串操作,或者是复习C语言的基础知识。他们可能希望得到更详细的解释,或者想了解不同的实现方式之间的区别,比如指针和索引方式的对比,或者时间复杂度等问题。 然后,我要考虑如何组织回答。之前的回复已经详细解释了代码的结构和步骤,现在可能需要补充其他实现方法,比如使用指针或者递归,或者讨论特殊情况处理,比如空指针、字符串常量等可能导致的问题。同时,用户可能对时间复杂度和空间复杂度感兴趣,需要解释为什么这个算法是O(n)的时间复杂度和O(1)的空间复杂度。 另外,用户可能在实际应用中遇到问题,比如缓冲区溢出,或者输入处理不当,所以需要提醒注意事项,比如输入长度的限制,或者使用更安全的函数如fgets代替scanf。还有可能涉及Unicode或多字节字符的问题,虽然这在C语言中处理起来比较复杂,但可以简要提及。 还要考虑用户可能的后续问题,比如如何测试这个函数,或者如何处理异常情况,比如传入NULL指针会导致程序崩溃,应该添加参数检查。这些都是可以扩展的内容,但需要根据用户当前的问题来调整详细程度。 最后,总结用户可能的深层需求:理解reverseString的实现原理,掌握不同的实现方法,了解潜在的问题和优化方向。因此,回答需要结构清晰,覆盖不同的实现方式,分析优缺点,并给出注意事项和扩展建议,确保用户能够全面理解并应用这个函数。</think>以下是关于 **`reverseString`** 函数的详细解析,涵盖其实现原理、不同写法及注意事项: --- ### 一、`reverseString` 的核心原理 **目标**:将字符串原地反转(不占用额外内存)。 **关键逻辑**: 1. **对称交换**:字符串的第 $i$ 个字符倒数第 $i$ 个字符交换(如 `str[0]` ↔ `str[length-1]`,`str[1]` ↔ `str[length-2]`)。 2. **终止条件**:只需遍历到字符串长度的一半($\text{length}/2$),避免重复交换导致复原。 --- ### 二、实现方法对比 #### 方法 1:使用 `for` 循环(索引操作) ```c void reverseString(char *str) { int length = strlen(str); for (int i = 0; i < length / 2; i++) { char temp = str[i]; str[i] = str[length - 1 - i]; str[length - 1 - i] = temp; } } ``` - **优点**:直观易读,适合初学者理解索引操作。 - **缺点**:依赖 `strlen` 计算长度(时间复杂度 $O(n)$)。 #### 方法 2:使用指针(无需计算长度) ```c void reverseString(char *str) { char *start = str; char *end = str + strlen(str) - 1; // 指向最后一个字符 while (start < end) { char temp = *start; *start = *end; *end = temp; start++; end--; } } ``` - **优点**:指针操作更高效,无需显式计算长度。 - **缺点**:对指针理解要求较高。 #### 方法 3:递归实现(不推荐实际使用) ```c void reverseStringRecursive(char *start, char *end) { if (start >= end) return; char temp = *start; *start = *end; *end = temp; reverseStringRecursive(start + 1, end - 1); } // 调用方式 reverseStringRecursive(str, str + strlen(str) - 1); ``` - **优点**:代码简洁,展示递归思维。 - **缺点**:栈溢出风险(字符串较长时效率极低)。 --- ### 三、关键问题分析 #### 1. **时间复杂度** - **$O(n)$**:无论循环还是指针实现,均需遍历 $\frac{n}{2}$ 次($n$ 为字符串长度)。 #### 2. **空间复杂度** - **$O(1)$**:原地修改,仅需常数级临时变量。 #### 3. **边界情况** - **空字符串**:`strlen` 返回 0,循环或指针操作自动跳过。 - **单字符字符串**:无需交换。 - **奇数长度字符串**:中间字符无需处理(如 `"hello"` 的 `'l'`)。 --- ### 四、注意事项 1. **输入安全性** - 若传入 **只读内存**(如字符串常量 `reverseString("hello")`),程序会崩溃。应确保参数为可修改内存。 - 避免缓冲区溢出:使用 `char word[100];` 时,建议限制输入长度(如 `scanf("%99s", word);`)。 2. **字符编码** - 仅适用于单字节字符(ASCII)。若含多字节字符(如中文 UTF-8),需特殊处理。 --- ### 五、扩展优化 - **添加参数校验**: ```c void reverseString(char *str) { if (str == NULL) return; // 防御空指针 // 原逻辑 } ``` - **支持宽字符**:使用 `wchar_t` 类型及宽字符函数。 --- 如果需要进一步探讨具体场景或优化方案,可以随时提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值