⭐算法入门⭐《线性枚举》简单01 —— LeetCode 344. 反转字符串

饭不食,水不饮,题必须刷

还不会C语言,和我一起打卡!
《光天化日学C语言》

LeetCode 太难?上简单题!
《C语言入门100例》

LeetCode 太简单?大神盘他!
《夜深人静写算法》

文章目录

  • 一、题目
    • 1、题目描述
    • 2、基础框架
    • 3、原题链接
  • 二、解题报告
    • 1、思路分析
    • 2、时间复杂度
    • 3、代码详解
  • 三、本题小知识

一、题目

1、题目描述

  编写一个函数,将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
  样例输入: [ “ a ” , “ b ” , “ c ” ] [“a”, “b”, “c”] [a,b,c]
  样例输出: [ “ c ” , “ b ” , “ a ” ] [ “c”, “b”, “a”] [c,b,a]

2、基础框架

  • c++ 版本给出的基础框架代码如下,要求不采用任何的辅助数组;
  • 也就是空间复杂度要求 O ( 1 ) O(1) O(1)
class Solution {
public:
    void reverseString(vector<char>& s) {
    }
};

3、原题链接

LeetCode 344. 反转字符串

二、解题报告

1、思路分析

  翻转的含义,相当于就是 第一个字符 和 最后一个交换,第二个字符 和 最后第二个交换,… 以此类推,所以我们首先实现一个交换变量的函数 swap,然后再枚举 第一个字符、第二个字符、第三个字符 …… 即可。
  对于第 i i i 个字符,它的交换对象是 第 l e n − i − 1 len-i-1 leni1 个字符 (其中 l e n len len 为字符串长度)。swap函数的实现,可以参考:《C语言入门100例》 - 例2 | 交换变量。

2、时间复杂度

  • 线性枚举为 O ( n ) O(n) O(n),交换变量为 O ( 1 ) O(1) O(1),两个过程是相乘的关系,所以整个算法的时间复杂度为 O ( n ) O(n) O(n)

3、代码详解

class Solution {
public:
    void swap(char& a, char& b) {            // (1)
        char tmp = a;
        a = b;
        b = tmp;
    }
    void reverseString(vector<char>& s) {
        int len = s.size();
        for(int i = 0; i < len / 2; ++i) {   // (2)
            swap(s[i], s[len-i-1]);
        }
    }
};
  • ( 1 ) (1) (1) 实现一个变量交换的函数,其中&是C++中的引用,在函数传参是经常用到,被称为:引用传递(pass-by-reference),即被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间
    ,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。

简而言之,函数调用的参数,可以传引用,从而使得函数返回时,传参值的改变依旧生效。

  • ( 2 ) (2) (2) 这一步是做的线性枚举,注意枚举范围是 [ 0 , l e n / 2 − 1 ] [0, len/2-1] [0,len/21]

三、本题小知识

函数调用的参数,可以传引用,从而使得函数返回时,传参值的改变依旧生效。


你可能感兴趣的:(《LeetCode算法全集》,LeetCode,算法,算法入门,线性枚举,交换变量)