leetcode-344-Reverse String

题目描述:

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

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

 

要完成的函数:

string reverseString(string s) 

 

说明:

1、这道题目十分容易,反转字符串。就算不使用c++的内置函数来反转或者来交换字母,我们也可以自己写出来如下代码:

    string reverseString(string s) 
    {
        int i=0,j=s.size()-1;
        char c;
        while(i<j)
        {
            c=s[j];
            s[j]=s[i];
            s[i]=c;
            i++;
            j--;
        }
        return s;
    }

实测10ms,beats 97.83% of cpp submissions。

2、这道题有个坑,就是字符串可能会很长。内存容纳一个很长的字符串没有问题,但是如果定义了一个新的字符串,把读取出来的字母逆序存放在新字符串上面,这样做就会超过memory limit。

也就是这道题有空间复杂度的要求。以后能少用点空间还是少用点吧,直接在原有字符串上处理。

3、分享两种使用c++内置函数的做法,给大家观赏一下。

//方法一,使用reverse函数直接反转
    string reverseString(string s) 
    {
        reverse(s.begin(),s.end());
        return s;
    }
//方法二,使用swap函数交换两个字母
    string reverseString(string s) 
    {
        int i=0;
        int j=s.size()-1;
        while(i<j)
            swap(s[i++],s[j--]);
        return s;
    }

上述两种代码跟1中代码,实测都是10ms,beats 97.83% of cpp submissions。

4、这道题看到有人使用了异或的方法去交换。异或方法如下:

a=a^b

b=a^b

a=a^b

这种做法其实从计算机组成的角度来看,需要读取3次a,读取3次b,异或运算3次,然后写入3次。

而如果使用直接交换的方法,如下:

c=a

a=b

b=c

只需要读取1次a,读取1次b,读取1次c,写入1次c,写入1次a,写入1次b。总共读取3次,写入3次,还不用做运算。比起异或运算,其实会更快。

在leetcode上写了个异或的代码如下:

    string reverseString(string s) 
    {
        int i=0,j=s.size()-1;
        while(i<j)
        {
            s[j]=s[j]^s[i];
            s[i]=s[j]^s[i];
            s[j]=s[j]^s[i];
            i++;
            j--;
        }
        return s;
    }

真的会慢一点……实测12ms,beats 36.69% of cpp submissions。

原文地址:https://www.cnblogs.com/chenjx85/p/8855327.html