Write a function that takes a string as input and returns the string reversed.
Example:
Given s = “hello”, return “olleh”.
这道题要求翻转字符串输出,看到这道题我的第一思路是使用string的const_reverse_iterator。后面又看了github上的解答,比我给的答案要好很多,直接将string折半对调,简单粗暴。
- 解法一:逆序遍历s,将s的每个元素push_back()入一个新的string revstr
1 2 3 4 5 6 7 8 9 10 |
class Solution { public: string reverseString(string s) { string revstr; string::const_reverse_iterator criter = s.crbegin(); for ( ; criter != s.crend(); ++criter) revstr.push_back(*criter); return revstr; } }; |
- 解法二:来自github,变量i正序遍历s的区间[0, s.size()/2),并与s[s.size()-i-1]交换
1 2 3 4 5 6 7 8 9 10 11 12 |
class Solution { public: string reverseString(string s) { int len = s.size(); for (int i = 0; i<len/2; ++i){ char ch = s[i]; s[i] = s[len-i-1]; s[len-i-1] = ch; } return s; } }; |
在此基础上,我修改了一下,一是将int—>string::size_type; 二是在for循环内直接调用算法std::swap():
1 2 3 4 5 6 7 8 9 |
class Solution { public: string reverseString(string s) { string::size_type i, len = s.size(); for (i = 0; i<len/2; ++i) swap(s[i], s[len-i-1]); return s; } }; |
- 小结:size_type和int的那些事儿?
(1)string类类型和许多其他库类型都定义了一些配套类型(companion type)。通过这些配套类型,库类型的使用就能与机器无关。size_type就是这些配套类型中的一种。size_type被定义为与unsigned型(unsigned int, unsigned long)具有相同的含义,而且可以保证足够大能够存储任意string对象的长度。为而来使用由string类型定义的size_type类型。程序员必须加上作用于操作符来说明所使用的size_type类型是由string类定义的。
(2)使用int变量的问题是:有些机器上的int变量的表示范围太小,甚至无法存储实际并不长的string对象。如在有16位int型的机器上,int类型变量最大只能表示32767个字符的string对象。而能容纳一个文件内容的string对象轻易就能超过这个数字,因此,为了避免溢出,保存一个string对象的size的最安全的方法就是使用标准库类型string::size_type()。
(3)size_t和size_type类似,size_t 类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版本.它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小。另外sizeof操作符的返回值的类型也为size_t。
(4)其实vector库也可以定义size_type类型,在vector库中还有一个difference_type类型,该类型用来存储任何两个迭代器对象间的距离,所以是signed类型的。