算法日记0001-字符串逆序

本文介绍了如何实现字符串逆序的基本算法,强调了传入参数应为char []而非char *的原因,并探讨了通过C++的string类型简化问题。同时,提到了利用STL中的vector reverse方法优化算法,达到O(n/2)的时间复杂度。
摘要由CSDN通过智能技术生成

开篇算法非常简单,就是实现将一个字符串逆序的功能,虽然逻辑很好写,但是里面的细节还是大大的有呀~
大家不要小看这个算法,后面连续几个算法都是基于此的哦~
题目要求就是将一个字符串逆序输出;

非常基础,先看代码~

#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方法,可以将两个迭代器之间的元素进行逆序排列,可以说是现成的逆序算法,我们只需要将两个迭代器指到字符串开始和最后就好了,都不用自己写了,很方便吧~
好啦,今天就到这里,明天会以此为基础,讲述更有技巧的东西~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值