面试题:单词翻转(代码简洁&效率)

本文介绍了一种常见的面试题目——单词翻转问题,并提供了两种实现方案:简洁版与效率版。简洁版易于理解但效率较低;效率版通过引用传递提高效率,但增加了代码复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:陈太汉

单词翻转问题是个大公司常考的一个面试题,在网上看了不少实现方法,感觉都有瑕疵,在下今天又无聊一次,自己写了两种实现方式
一个是简洁版,一个是效率版
简洁版当然是简洁明了,思路清晰,很容易看懂,但是效率上有待改进,等改进之后发现发现就不是那么好理解了,所以就有了效率版,
个人还是主张简洁版,它看起来实在是舒服,让我很是满意。
为什么说简洁版效率有瑕疵呢?就是因为方法InvertWord的参数是值传递,就会不断的有变量构造和析构,
效率版就是解决这个问题,改为引用传递,但是引用传递又产生了另一些问题。看一下代码,你会懂的。

//将一句话翻转
// I  am a student--> student a am I
//先每个单词翻转,再整句话翻转

简洁版
1 #include < iostream >
2 #include < string >
3   using namespace std;
4
5   class InvertWords{
6 public :
7 InvertWords( string * wo):words(wo){}
8 void Invert()
9 {
10 int len = words -> size();
11 int beg =- 1 ;
12 // 翻转整个字符串
13 InvertWord(beg,len);
14 // 翻转每个单词
15 for ( int i = 0 ;i < len;i ++ )
16 {
17 if (words -> at(i) == ' ' )
18 {
19 InvertWord(beg,i);
20 beg = i;
21 }
22 }
23 }
24
25 private :
26 void InvertWord( int beg, int end)
27 {
28 char tmp;
29 while ( ++ beg <-- end)
30 {
31 tmp = words -> at(beg);
32 words -> at(beg) = words -> at(end);
33 words -> at(end) = tmp;
34 }
35 }
36 string * words;
37 };
效率版
1 #include < iostream >
2 #include < string >
3 using namespace std;
4
5 class InvertWords{
6 public :
7 InvertWords( string * wo):words(wo){}
8 void Invert()
9 {
10 int len = words -> size();
11 int beg =- 1 ,k;
12 // 翻转整个字符串
13 InvertWord(beg,len);
14 // 由于方法InvertWord的参数为引用类型,beg和len的值都被修改了,所以要还原他们的值
15 beg =- 1 ;
16 len = words -> size();
17 // 翻转每个单词
18 for ( int i = 0 ;i < len;i ++ )
19 {
20 k = i; // k的作用就是保存现场,为了还原i到当前值
21 if (words -> at(i) == ' ' )
22 {
23 InvertWord(beg,i);
24 i = k; // 还原i
25 beg = i;
26 }
27 }
28 }
29
30 private :
31 void InvertWord( int & beg, int & end)
32 {
33 char tmp;
34 while ( ++ beg <-- end)
35 {
36 tmp = words -> at(beg);
37 words -> at(beg) = words -> at(end);
38 words -> at(end) = tmp;
39 }
40 }
41 string * words;
42 };
测试代码
1 int main()
2 {
3 string s = " i am a student " ;
4 InvertWords * rw = new InvertWords( & s);
5 rw -> Invert();
6 cout << s << endl;
7 int a = 0 ;
8 cin >> a;
9 return 0 ;
10 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值