IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C++算法题:关于字符串的算法 -> 正文阅读

[数据结构与算法]C++算法题:关于字符串的算法

问题1:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。

思路:先逆转整个句子,然后从首字符开始扫描,每扫描到一个单词(遇到空白或结束字符),对这个单词进行逆转。

代码:采用左闭右开的形式

void Reverse(char *pBegin, char *pEnd)  
{  
    if(pBegin == pEnd)  
        return;  
//pEnd先减减,这里就考虑 过滤空格了
    while(pBegin < --pEnd)  //例:abc
    {  
        char tmp = *pBegin;  
        *pBegin = *pEnd;  
        *pEnd = tmp;  
        pBegin++;  
    }  
}  
void ReverseSentence(char *pSentence)  
{  
    if(pSentence == NULL)  
        return;  
  
    Reverse(pSentence, pSentence+strlen(pSentence));  
    char *pBegin = pSentence;  
    char *pEnd = pSentence;  
    while(*pEnd != '\0')  	//不为结束符
    {  
        if(*pEnd != ' ')  	//不为空格
            pEnd++;  
        else  
        {  
            //遇到空格,逆转这个单词  
            Reverse(pBegin, pEnd);   
            pBegin = ++pEnd;  
        }  
    }  
    //逆转最后一个单词  
    Reverse(pBegin, pEnd);  
}  

问题2:在字符串中删除特定元素

具体描述,输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。

//函数功能 : 在字符串中删除特定字符  
//函数参数 : pSrc为源字符串,pDel为特定字符集  
//返回值 :   空  
void DeleteSpecialChars(char *pSrc, char *pDel)  
{  
    if(pSrc == NULL || pDel == NULL)  
        return;  
    int lenSrc = strlen(pSrc);  
    int lenDel = strlen(pDel);  
    if(lenSrc == 0 || lenDel == 0)  
        return;  
    //又是运用哈希表
    bool hash[256] = { false };  
    for(int i = 0; i < lenDel; i++) //建立删除字符的索引  
        hash[pDel[i]] = true;  	//以字符为索引下标
    //开始删除  
    char *pCur = pSrc;  
    while(*pSrc != '\0')  
    {  
        if(hash[*pSrc] == false) //不用删除  
            *pCur++ = *pSrc;  
        pSrc++;  
    }  
    *pCur = '\0';  
}

问题3:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。

还是用哈希算法

//函数功能 : 在一个字符串中找到第一个只出现一次的字符  
//函数参数 : pStr为源字符串  
//返回值 :   目标字符  
char FirstAppearOnce(char *pStr)  
{  
    if(pStr == NULL)  
        return '\0'; //未找到返回空字符  
    //因为asicc码,不会超过256所以用数组
    int count[256] = {0};  
    char *pTmp = pStr;  
      
    while(*pTmp != '\0')  //统计字符串中每个字符出现的次数  
    {  
        count[*pTmp]++;  
        pTmp++;  
    }  
    while(*pStr != '\0') //遍历字符串,找到第一个只出现一次的字符  
    {  
        if(count[*pStr] == 1)  
            break;  
        pStr++;  
    }  
    return *pStr; //找到的字符  
}  

问题4:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。

这个问题主要是考察各种不正常情况的处理。假设函数的声明为 int StrToInt(const char *str);

(1)输入的字符串指针为空;

(2)数字前面有正负号的处理;

(3)字符串表示的数字超过了32位整数能表示的范围,即溢出处理;

(4)输入了非法字符,即除了数字及正负号的其他字符;

(5)以字符' 0 '开始的串,' 0 '后面还跟了其他字符,也是非法的。

bool strToIntOK; //全局的变量    
int StrToInt(const char *str)    
{    
    strToIntOK = false;    
    if(str == NULL)  //空指针    
        return 0;    
        
    if(str[0] == '0' && str[1] != '\0') //以'0'开始但不是"0" 这条其实可以忽略    
        return 0;    
        
    unsigned i = 0;    
    bool minus = false;    //负数标记    
    if(str[i] == '-' || str[i] == '+')  //判断是不是以正负号开始    
    {    
        minus = (str[i] == '-')? true: false;    
        i++;    
    }    
        
    long long result = 0;  //转换的结果   
    while(str[i] != '\0')    
    {    
        char c = str[i++];    
        if(c >= '0' && c <='9')    
        {  
     //c - '0' 将字符转换为数字  
            result = result * 10 + (c - '0');    
            if(minus) //负溢出  
            {  
                if(result - 1 > numeric_limits<int>::max())   
                    return 0;    
            }  
            else //正溢出  
            {  
                if(result > numeric_limits<int>::max())  
                    return 0;    
            }  
        }    
        else    
        {    
            return 0;    
        }    
    }    
    strToIntOK = true;    
    //结果返回 需强制转换一下    
    return minus? (int)(-result):(int)result;    

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:59:05  更:2022-05-09 12:59:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:38:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码