面试题分享:一道常见的C++程序员面试题
如果以编程难度为标准,我认为这道题的难度应该是三颗星(五颗星为最高难度)。
难度不算很高,只需要掌握C++字符串操作和双指针法即可完成。
同时,答案也比较简单明了,代码实现也非常直观。但如果以面试考察范围进行评估,因为该问题是C++基础语法中的一个小问题,所以面试官可能会根据候选人的表现来定位其技能水平,并根据此为基础提出更深入、更具挑战性的问题。
问题:
请编写一个函数 reverseStr(string s),将字符串s反转并返回。
例如,若输入为 "hello world",则函数应返回 "dlrow olleh"。
要求使用 C++ 语言实现,并尽可能优化算法时间复杂度和空间复杂度。
样例输入输出:
输入: "hello world"
输出: "dlrow olleh"
解题思路:
这道题可以采用双指针法来实现字符串反转。具体来说,我们定义两个指针i和j,分别指向字符串s的首尾位置。然后交换i和j指向的字符,并将i和j向中间移动,直到它们相遇为止。
最后返回反转后的字符串即可。
以下是示例代码:
#include <iostream>
#include <string>
using namespace std;
string reverseStr(string s) {
int i = 0, j = s.size() - 1;
while (i < j) {
swap(s[i], s[j]);
++i;
--j;
} return s;
} int main() {
string s = "hello world";
cout << reverseStr(s) << endl;
// 输出结果为:dlrow olleh
return 0;
}
以上代码中,我们先定义了两个指针i和j,初始时分别指向字符串s的首尾位置。然后在循环中,我们不断交换i和j指向的字符,并将i和j向中间移动。当i和j相遇时,反转结束。最后,我们将反转后的字符串返回即可。
该算法的时间复杂度为O(n),其中n为字符串的长度,空间复杂度为O(1)。由于只需要对字符串进行一次遍历,因此该算法的时间复杂度较低,适合处理大规模数据。
关注 微信公众号:奇牛编程