字符数组单词逆序

http://www.oschina.net/code/snippet_134658_24981/**


* 题目:将字符数组a转换成apple an is this,可以把它叫做字符数组单词逆序
* 要求:1、不能开辟新的数组或者其他内存单元,使其空间复杂度为O(1)
*          {空间复杂度:空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度
*           如当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1)
*           表示该程序所占用的空间和所用数据量无关}
*       2、不能使用C++特性
*/


(一)

#include <stdio.h>

void swap(const char str[], char *head, char *tail);

void main()
{
    char str[] = {'t','h','i','s',' ','i','s',' ','a','n',' ','a','p','p','l','e','\0'};
    /**
    * 思路:先整个字符串做反转操作,然后在对其中的单词做反转操作
    */
    
    char *head = str;    // 头指针
    char *p = str;    // 活动指针
    
    while(*p != '\0')
    {
        p++;    // 指针移到最后,指针只能做移动操作,而不能指哪打哪
    }
    p--;    // '\o'不做反转操作,留着做字符串结束符
    
    char *tail = p; // 尾指针
    swap(str, head, tail);        // 全部反转
    
    p = str;
    while(*p != '\0')
    {
        if(*p == ' ')
        {
            tail = p - sizeof(char);    
            // 将指针指向上一个元素的地址,数组是连续的存储单元,这里直接用地址减去一个char单元大小
            swap(str, head, tail);    // 反转字符串中的单词
            head = p;        // 反转后在移动指针
            if(*head == ' ')
                head++;
        }
        p++;
    }
    
    // 此时p指针已经移动到最后一个元素了
    if(*p == '\0')    /* 反转最后一个单词 */
    {
        tail = p - sizeof(char);
        swap(str, head, tail);    // 反转字符串中的单词
    }
    
    printf(str);
    printf("\n");
    
    
    head = NULL;    // 防止野指针
    p = NULL;        // 防止野指针
    tail = NULL;    // 防止野指针
    
}

/************************************************************************/
/*  功能:反转字符数组中指定开头和结束位置的字符                        */
/************************************************************************/
void swap(const char str[], char *head, char *tail)
{
    
    while(head < tail)
    {
        char c = *head;
        *head = *tail;
        *tail = c;
        
        head++;
        tail--;
    }

}


(二)

#include<stdio.h>
#include<string.h>
//翻转函数,将字符数组元素首尾互换
void swapstr(char *head,char *tail)
{
    while(head < tail){
        char c = *head;
        *head = *tail;
        *tail = c;

        tail--;
        head++;
    }
}

int main(void)
{
    char str[128] = {0};
    
    printf("please input a sentence:\n");
//    scanf("%s",str);
//此处建议使用fgets()函数,fgets()能够接收到空格和回车
    fgets(str,128,stdin);
//去掉接收到的回车符
    str[strlen(str)-1] = '\0';

    char *p,*head,*tail;

    p = head = tail =&str[0];
    
    while(*tail != '\0'){
        tail++;
    }
    tail -= sizeof(char);//定位最后一个字符的位置
    swapstr(head,tail);//将整句话按照字母翻转

    while(*p != '\0'){
//翻转字符数组中的单词
        if(*p == ' '){
            tail = p - sizeof(char);
            swapstr(head,tail);
            head = ++p;
        }
//此处用while()或者if(),if版本参见源码
        while(*head == ' '){
            head++;
        }

        p++;
    }
//最后一个单词的翻转
    if(*p == '\0'){
        tail = p - sizeof(char);
        swapstr(head,tail);
    }
    
    puts(str);
    
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值