zoukankan      html  css  js  c++  java
  • C/C++反序输出字符串总结

    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 &lt; 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;
    }

    估计一般没人会这么写吧。。。

  • 相关阅读:
    I NEED A OFFER!
    水题 Codeforces Round #303 (Div. 2) A. Toy Cars
    模拟 HDOJ 5099 Comparison of Android versions
    模拟 HDOJ 5095 Linearization of the kernel functions in SVM
    贪心 HDOJ 5090 Game with Pearls
    Kruskal HDOJ 1863 畅通工程
    Kruskal HDOJ 1233 还是畅通工程
    并查集 HDOJ 1232 畅通工程
    DFS/并查集 Codeforces Round #286 (Div. 2) B
    水题 Codeforces Round #286 (Div. 2) A Mr. Kitayuta's Gift
  • 原文地址:https://www.cnblogs.com/bluestorm/p/2298175.html
Copyright © 2011-2022 走看看