数据结构——字符串(3)字符串单词数量&&字符串逆序

使用字符数组保存字符串,进行操作。

/************************************************************************/
/*  刷题:字符串相关题目                                                   */
/************************************************************************/

/*          1.统计一行字符中单词数目       */
int WordCount(string s)
{
    int count=0;
    int worldFlag=0;
    char c;
    for (int i=0;(c=s[i])!='\0';i++)
    {
        if (c==' ')
        {
            worldFlag=0;
        }
        else if (worldFlag ==0)
        {
            worldFlag=1;
            count++;
        }
    }
    printf("%d\n",count);
    return count;
}


/************************************************************************/
/*                          2.字符串逆序                                 */
/************************************************************************/  

//  /*******  (1)直接分配一个与原字符串等长的字符数组,然后反向拷贝即可                *******/
char *Reverse(char * s)     //main函数中实参用字符数组,所以这里用一个字符指针
{

    char *q=s;
    while(*q++)
        ;                       //这个空语句不做任何操作,只是让q指针找到最后一个元素

    q-=2;           //减2是因为while循环中q为空的时候,q又向后移动了1位
    char *p= new char[sizeof(char) *(q-s+2)];       //字符个数计算,要考虑结束符
    char *r=p;

    //逆序存储
    while(q>=s)
    {
        *p++=*q--;
    }
    *p='\0';
    return r;


}


/****    (2)原地逆序,不分配新的存储空间  ****/

//① 设置两个指针
char *Reverse2(char *s)
{
    char *p=s;//设置两个指针:指向头和尾
    char *q=s;

    while (*q++)
        ;
    q-=2;

    while(p<=q)
    {
        char temp;
        temp=*p;
        *p++=*q;
        *q--=temp;

    }
    return s;
}

// ②递归法,从两边向中间,互相交换数据
char *Reverse3(char *s, int left, int right)            
{
    if (left>=right)
        return s;
    char temp=s[left];
    s[left]=s[right];
    s[right]=temp;
    Reverse3(s,left+1,right-1);

}

//③非递归法。从两边向中间,交换数据
char *Reverse4(char *s, int left, int right)
{
    if (left>=right)
        return s;
    while(left<=right)
    {
        char temp=s[left];
        s[left++]=s[right];
        s[right--]=temp;
    }
    return s;
}



/****    (3)原地逆序,不允许有临时变量  ****/
//①异或操作
//②使用字符串结束符‘\0’作为交换空间


/****    (4)按照单词逆序:先将每个单词反转,然后再将整个字符串反转  ****/
void ReverseSingleWord(char *p, char *q)
{
    while(p<q)
    {
        char temp=*p;
        *p++ =*q;
        *q-- =temp;
    }
}

char *WordReverse(char *s)
{
    char *p= s;
    char *q=s;
    while(*q !='\0')
    {
        if (*q == ' ')
        {

            ReverseSingleWord(p,q-1);
            q++;                    //指针后移,找下一个单词
            p=q;
        }
        else
            q++;

    }
    ReverseSingleWord(p,q-1);
    ReverseSingleWord(s,q-1);
    return s;

}



/************************************************************************/
/*              3. 找出一个字符串中第一个只出现一次的字符                   */
/************************************************************************/  
char GetFirstSingleChar(char s[])
{
    if (s==NULL)
        return 0;
    const int size=256;
    unsigned count[size]={0};
    char buffer[size];
    char* q=buffer;


    for (const char *p=s; *p!=0; p++)       //这里不用const也可以,为什么要用??
    {
        if ( ++count[(unsigned char)*p] ==1)
                *q++ =*p;
    }
    for (const char *p=buffer; p<q; p++)
    {
        if (count[(unsigned char)*p]==1)
                return *p;

    }

    return 0;
}

//判断是否为数字
void IsInt(char c)
{
    if (c>='0' && c<='9')
    {
        cout<<"c是整数:"<<c<<endl;
    }
    else
        cout<<"c不是整数"<<endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
程序 = 数据结构 + 算法  程序是为了解决实际问题而存在的。然而为了解决问题,必定会使用到某些数据结构以及设计一个解决这种数据结构的算法。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。编程实战算法,不是念PPT,我们讲的就是实战与代码实现与企业应用。程序 = 数据结构 + 算法                ——图灵奖得主,计算机科学家N.Wirth(沃斯)作为程序员,我们做机器学习也好,做python开发也好,java开发也好。有一种对所有程序员无一例外的刚需 —— 算法与数据结构日常增删改查 + 粘贴复制 + 搜索引擎可以实现很多东西。同样,这样也是没有任何竞争力的。我们只可以粘贴复制相似度极高的功能,稍复杂的逻辑没有任何办法。语言有很多,开发框架更是日新月异3个月不学就落后我们可以学习很多语言,很多框架,但招聘不会考你用5种语言10种框架实现同一个功能。真正让程序员有区分度,企业招聘万年不变的重点 —— 算法与数据结构。算法代表程序员水平的珠穆朗玛。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。 想写出精炼、优秀的代码,不通过不断的锤炼,是很难做到的。 开这个系列的目的是为了自我不断积累。不积跬步无以至千里嘛。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值