开篇算法非常简单,就是实现将一个字符串逆序的功能,虽然逻辑很好写,但是里面的细节还是大大的有呀~
大家不要小看这个算法,后面连续几个算法都是基于此的哦~
题目要求就是将一个字符串逆序输出;
非常基础,先看代码~
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<string>
#include<stdio.h>
using namespace std;
char * rev_str(char * str)
{
int len = strlen(str);
for(int i = 0; i < len/2; i++)
{
swap(str[i], str[len-i-1]);
}
return str;
}
int main(int argc, char ** argv)
{
char str_array[] = "12345";
rev_str(str_array);
printf("%s\n",str_array);
system("pause");
return 0;
}
这里面还是有些文章的。
首先传入的不能是char * 类型,只能是char []类型,新手经常犯这个错误,因为一般大学老师在讲指针的时候为了突出数组和指针的关系,总是说这两个是等价的,然而,在其他条件下,这两个即便是等价,也是编译器在里面做了一些工作使其等价的。
这个是因为char * 类型的数组大小是不定的,而char []类型的定长的。char[]是一个数组定义,char*是指针定义,这里面还有很多知识,具体请参考这篇文章,说得十分详细:
http://blog.csdn.net/yahohi/article/details/7427724
还有就是算法的优化,将算法优化在O(n/2),做法就是从首尾开始,向中间推进直到中间,这样整个字符串就被逆序了。
有一种比较好的方法解决char * 和char[]的问题,就是使用C++的string类型,这样整个字符串就是一个变量,就不涉及数组、指针这种复杂的问题了:
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
void rev_str(string & str)
{
int len = strlen(str.c_str());
for(int i = 0; i < len/2; i++)
{
swap(str[i],str[len-i-1]);
}
return;
}
int main()
{
string str;
cin >> str;
rev_str(str);
cout << str <<endl;
system("pause");
return 0;
}
个人还是偏向C++,很多地方真的很方便,虽然本日记目前不太涉及面向对象的内容~
另外,熟练使用stl模板库也是很加分的一种方法:
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdlib>
#include<cstring>
using namespace std;
void rev_str(vector<char> & v)
{
reverse(v.begin(), v.end());
return;
}
int main(int argc, char ** argv)
{
vector<char> v(10);
string str;
cin >> str;
for(int i = 0; i < strlen(str.c_str()); i++)
{
v.push_back(str[i]);
}
rev_str(v);
for(vector<char>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << *it;
}
cout<<endl;
system("pause");
return 0;
}
vector有一个reverse方法,可以将两个迭代器之间的元素进行逆序排列,可以说是现成的逆序算法,我们只需要将两个迭代器指到字符串开始和最后就好了,都不用自己写了,很方便吧~
好啦,今天就到这里,明天会以此为基础,讲述更有技巧的东西~