2年前去T公司面试,面试官给了我一张纸一支笔,说写个程序吧,输入一个字符串然后反序输出。我问输入输出是用函数参数呢还是系统I/O,面试官说随你便,写完了说说各有什么优缺点吧。当时我大三,没有参加过ACM没有实验室经历除了课程设计也没写过什么程序,完全小白。当然至今也仍然是菜鸟一只,不堪回首啊。
方法一:据说有库函数strrev()啊
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <stdio.h> #include <string.h> int main(int argc, char* argv[]) { if (argc != 2) { printf("Usage: %s string/n/n", argv[0]); return -1; } char* str = argv[1]; strrev(str); printf("Reversed string: %s/n", str); return 0; } |
结果Linux下编译报错,说找不到strrev()这个函数,我勒个去,坑爹呢这是?VS2010编译通过正常运行。好吧,还是自己来写一个吧~
方法二:首尾互换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <iostream> #include <cstring> using namespace std; char *reverse(char *str) { int len = strlen(str); char *head = str; char *tail = str + len - 1; while (head < tail) { char tmp = *head; *head++ = *tail; *tail-- = tmp; } return str; } int main(int argc, char* argv[]) { if (argc != 2) { cout << "Usage: " << argv[0] << " string" << endl; return -1; } cout << "Reversed string: " << reverse(argv[1]) << endl; return 0; } |
终于都通过了啊。就用了个循环把字符串里的字符逐个首尾互换了。啥?性能?有啥问题?没看到每次进循环都要新建变量tmp吗?这这这。。。这也有影响?好吧,把这个声明放到循环外面。还能提升么?去掉字符互换操作!!直接从尾巴倒过来输出不就得了~
方法三:从尾到头
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> #include <string> using namespace std; int main() { string str; cout << "Input: "; cin >> str; unsigned int i = str.length(); cout << "Reversed string: "; while(i != 0) { cout << str[i-1]; --i; } cout << endl; return 0; } |
这回用了I/O做输入,并且还能保留原来的字符串不变。嗯,不错不错,其实我们连字符串长度都不需要知道。再写一个~
方法四:递归
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> using namespace std; void reverse(char *str) { if(*str) reverse(str+1); else return; cout << *str; } int main() { char str[1024] = {NULL}; cout << "Input: "; cin >> str; reverse(str); cout << endl; return 0; } |
估计一般没人会这么写吧。。。