不开辟临时空间,实现以单词为单位反转字符串

2024-03-11 21:48

本文主要是介绍不开辟临时空间,实现以单词为单位反转字符串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

摘自http://blog.chinaunix.net/uid-21228455-id-2406482.html

「原题
Write a function that reverse string word by word. 
For instance:
"The houst is blue" --> "blue is house the"
"Zed is dead"       --> "dead is Zed"
"All-in-one"        --> "All-in-one"
「两个方法
1. 先翻转整个字符串;再翻转每一个单词。
2. 先翻转每一个单词;再翻转整个字符串。
其实一样,只是先后顺序不同,严格来说,不能算两种方法。

「具体实现windows下(vc6.0, C语言)

/* 
我的假设
1. 单词严格以空格进行划分,最后一个单词以'\0'进行划分;
2. 删除单词间重复的空格,只保留一个;
3. 删除字符串末尾的空格;
4. 对于只有一个单词的字符串,不进行任何翻转动作(flag表示)。 
*/


#include <stdio.h>
#include <string.h>

/* memcpy函数的实现*/
void myMemcpy(void *dest, const void *src, size_t count)
{
    char *pDest = (char *)dest;
    char *pSrc = (char *)src;

    /* 目的地址和源地址重叠,从源地址的末尾方向开始拷贝 */
    if(pDest > pSrc && pDest < pSrc+count){
        for(pDest += (count-1), pSrc += (count-1); count != 0; count--){
            *pDest--= *pSrc--;
        }
    }else{
        /* 目的地址和源地址不重叠,从源地址的开始方向拷贝 */
        while(count--){
            *pDest++ = *pSrc++;
        }
    }

};

/* 不用临时变量,翻转字符串a[begin...end] */
void stringReverse(char a[], int begin, int end)
{
    for(; begin < end; begin++, end--){
        a[begin] ^= a[end];
        a[end] ^= a[begin];
        a[begin] ^= a[end];
    }
}

/* 以单词为单位翻转字符串 */
void stringReverseOnWord(char a[])
{
    char *begin = a;
    char *end = a;
    int len = strlen(a);
    int flag = 0;

    /* 对于空字符串以及只有一个字符的字符串不做任何处理 */
    if(*== '\0' || *(a+1) == '\0') {
        return;
    }

    /* 删除单词间重复的空格,只保留一个 */
    for(; *begin != '\0'; begin++){
        if(*begin == ' '){
            flag = 1;
            end = begin+1;
            while(*end == ' '){
                end++;
            }
            myMemcpy(begin+1, end, len-(end-1-a)); /* 完全可以用库函数代替,此处只是复习下memcpy的实现 */
        }
    }

 

 /* 删除重复空格时的情况

a             begin       end-1 end                 a+len

 c1

 ...

 cx

 空格

 ...

空格

 Cy

 ...

 cn-1

cn 

‘\0’ 

*/  

 

   /* end指向字符串结尾处'\0',在处理字符串前,还要将end指向最后一个非'\0'处 */
    end = begin;
    --end;
    
    /* 删除字符串末尾的空格 */
    while(*end == ' '){
        *end = '\0';
        end--;
    }

    /* 字符串不止一个单词,需要翻转 */
    if(flag == 1){
        stringReverse(a, 0, end-a);
        /* 删除字符串末尾的空格 */
        while(*end == ' '){
            *end = '\0';
            end--;
        }
        for(begin = end =a; *end != '\0'; end++){
            if(*end == ' '){ /* begin指向单词的第一个字符,(end-1)指向该单词的末尾 */
                stringReverse(begin, 0, end-1-begin);
                begin = end+1;
            }
        }

 

/*单词翻转时,begin和end指针的指向示意图

          begin    end-1 end               

 ...

空格

 c1

 ...

cx         

 空格

 Cy

 ...

 cn-1

cn 

‘\0’ 

*/

 


        /* 最后一个单词的处理 */
        if(*end == '\0' && end-begin > 1){
            stringReverse(begin, 0, end-begin-1);
        }
    }

}

int main()
{
    char a[] = "All-in-one";
    char b[] = " hello             I            will be with you";

    printf("%s\n", a);
    stringReverseOnWord(a);
    printf("%s\n", a);

    printf("%s\n", b);
    stringReverseOnWord(b);
    printf("%s\n", b);

    return 0;
}

这篇关于不开辟临时空间,实现以单词为单位反转字符串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/799186

相关文章

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主