算法入门 01线性枚举(简单 - 第一题)LeetCode 344

Posted 英雄哪里出来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法入门 01线性枚举(简单 - 第一题)LeetCode 344相关的知识,希望对你有一定的参考价值。


一、题目

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]

三、本题小知识

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


以上是关于算法入门 01线性枚举(简单 - 第一题)LeetCode 344的主要内容,如果未能解决你的问题,请参考以下文章

算法入门 01线性枚举(简单 - 第三题)LeetCode 876

算法入门 01线性枚举(简单 - 第二题)LeetCode 557

⭐算法入门⭐《线性枚举》简单07 —— LeetCode 414. 第三大的数

⭐算法入门⭐《线性枚举》简单05 —— LeetCode 485. 最大连续 1 的个数

⭐算法入门⭐《线性枚举》简单03 —— LeetCode 26. 删除有序数组中的重复项

⭐算法入门⭐《线性枚举》简单04 —— LeetCode 1464. 数组中两元素的最大乘积