LeetCode第一弹——Reverse String

1、题目描述

Write a function that reverses a string. The input string is given as an array of characters char[].

Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.

You may assume all the characters consist of printable ascii characters.

Example 1:
Input: [“h”,“e”,“l”,“l”,“o”]
Output: [“o”,“l”,“l”,“e”,“h”]

Example 2:
Input: [“H”,“a”,“n”,“n”,“a”,“h”]
Output: [“h”,“a”,“n”,“n”,“a”,“H”]

2、不使用任何中间变量交换a,b的值

  参考如下代码:

#include<stdio.h>

void swap1(int& a, int& b)
{
	int temp = a;
	a = b;
	b = temp;
}

void swap2(int& a, int& b)
{
	a=a+b;
	b=a-b;
	a=a-b;
}

void swap3(int& a, int& b)
{
	a^=b;
	b^=a;
	a^=b;
}

  以上有三个swap函数,都是采用引用传参的方式。

  1. swap1()显然不是我们需要的
  2. swap2()采用的是一种简单的加减运算来达到交换a,b的目的,这种方式的缺点是有可能会出现溢出。
  3. swap3()采用了按位异或的方式交换a,b。相比于swap2(),推荐swap3()。

3、解题思路

  这里分两类方法,递归与非递归

3.1、递归解法

解法1:异或交换

class Solution {
public:
    void reverseString(vector<char>& s) {
        
        if(!s.empty())
        {
            helper(s, 0, s.size()-1);
        }
               
               
    }
    void helper(vector<char>& s, int left, int right)
    {
        if(left < right)
        {
            s[left]^=s[right];
            s[right]^=s[left];
            s[left]^=s[right];
            helper(s, left+1, right-1);
        }
    }
};

478 / 478 个通过测试用例
状态:通过
执行用时:44 ms
内存消耗:23.4 MB
已经战胜 98.36 % 的 cpp 提交记录

解法二:普通交换

class Solution {
public:
    void reverseString(vector<char>& s) {
        
        if(!s.empty())
        {
            helper(s, 0, s.size()-1);
        }
               
               
    }
    void helper(vector<char>& s, int left, int right)
    {
        if(left < right)
        {
            char temp = s[left];
            s[left] = s[right];
            s[right] = temp;
            helper(s, left+1, right-1);
        }
    }
};

478 / 478 个通过测试用例
状态:通过
执行用时:48 ms
内存消耗:23.4 MB
已经战胜 95.70 % 的 cpp 提交记录

3.2、非递归解法

解法一:异或交换

class Solution {
public:
    void reverseString(vector<char>& s) {
        
        if(!s.empty())
        {
            int left = 0;
            int right = s.size()-1;
            while(left < right)
            {
                s[left]^=s[right];
                s[right]^=s[left];
                s[left]^=s[right];
                left++;
                right--;
            }       
        }                       
    }    
};

478 / 478 个通过测试用例
状态:通过
执行用时:44 ms
内存消耗:23.3 MB
已经战胜 98.36 % 的 cpp 提交记录

解法二:普通交换

class Solution {
public:
    void reverseString(vector<char>& s) {
        
        if(!s.empty())
        {
            int left = 0;
            int right = s.size()-1;
            while(left < right)
            {
                char temp = s[left];
                s[left] = s[right];
                s[right] = temp;
                left++;
                right--;
            }       
        }        
               
    }
    
};

478 / 478 个通过测试用例
状态:通过
执行用时:48 ms
内存消耗:23.5 MB
已经战胜 95.70 % 的 cpp 提交记录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值