写点什么

每日算法刷题 Day7- 比较字符串大小,去掉多余的空格,单词替换

作者:timerring
  • 2022 年 9 月 29 日
    山东
  • 本文字数:2464 字

    阅读完需:约 8 分钟

⭐每日算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,与笔者另一系列文章有所区别,并不是以知识点的形式提升算法能力,而是以实战习题的形式理解算法,使用算法。

🔥本文已收录于算法刷题系列专栏: 每日算法题解 欢迎订阅,持续更新。



@[toc]

23.忽略大小写比较字符串大小

一般我们用 strcmp 可比较两个字符串的大小,比较方法为对两个字符串从前往后逐个字符相比较(按 ASCII 码值大小比较),直到出现不同的字符或遇到 \0 为止。


如果全部字符都相同,则认为相同;如果出现不相同的字符,则以第一个不相同的字符的比较结果为准。


但在有些时候,我们比较字符串的大小时,希望忽略字母的大小,例如 Hellohello 在忽略字母大小写时是相等的。


请写一个程序,实现对两个字符串进行忽略字母大小写的大小比较。

输入格式

输入为两行,每行一个字符串,共两个字符串。注意字符串中可能包含空格。


数据保证每个字符串的长度都不超过 80。

输出格式

如果第一个字符串比第二个字符串小,输出一个字符 <


如果第一个字符串比第二个字符串大,输出一个字符 >


如果两个字符串相等,输出一个字符 =

输入样例:

Hellohello
复制代码

输出样例:

=
复制代码

思路:

  • c_str 是 Borland 封装的 String 类中的一个函数,它返回当前字符串的首字符地址。

  • 标准头文件<cstring>包含操作 c-串的函数库。这些库函数表达了我们希望使用的几乎每种字符串操作。

  • 当调用库函数,客户程序提供的是 string 类型参数,而库函数内部实现用的是 c-串,因此需要将 string 对象,转化为 char*对象,而 c_str()提供了这样一种方法,它返回 const char*类型(可读不可改)的指向字符数组的指针。


#include <iostream>#include <string>#include <cstring>
using namespace std;
int main(){ string a,b; getline(cin,a); getline(cin,b);
for (int i = 0; i < a.size(); i ++) if (a[i] >= 'A' && a[i] <= 'Z') a[i] += 32;
for (int i = 0; i < b.size(); i ++) if (b[i] >= 'A' && b[i] <= 'Z') b[i] += 32;
int c; c = strcmp(a.c_str(),b.c_str()); if(c < 0) cout << "<"; if(c == 0) cout << "="; if(c > 0) cout << ">";
return 0;}
复制代码

24.去掉多余的空格

输入一个字符串,字符串中可能包含多个连续的空格,请将多余的空格去掉,只留下一个空格。

输入格式

共一行,包含一个字符串。

输出格式

输出去掉多余空格后的字符串,占一行。

数据范围

输入字符串的长度不超过 200200。保证输入字符串的开头和结尾没有空格。

输入样例:

Hello      world.This is    c language.
复制代码

输出样例:

Hello world.This is c language.
复制代码

思路

思路一:用 cin 过滤空格


#include<bits/stdc++.h>using namespace std;
int main(){ string s; while(cin>>s) cout<<s<<" "; return 0;}
复制代码


思路二:双指针做法


#include<bits/stdc++.h>using namespace std;
int main(){ string s; getline(cin, s); string r; for(int i = 0; i < s.size(); i++) if(s[i] != ' ')r += s[i]; else { r += ' '; //下面三行是常见的双指针做法 int j = i; while(j < s.size() && s[j] == ' ') j++; i = j - 1; } cout<<r<<endl; return 0;}
复制代码


思路三:移动的方法


#include<bits/stdc++.h>using namespace std;
int main(){ string str; getline(cin, str); for(int i = 0,len = str.size(); i<len ;i++) { if(str[i] == ' ' &&str[i+1] == ' ') { for(int j = i; j<len;j++) str[j] = str[j+1]; //接下来由于循环结束会i++,因此这里提前减去。 i--; } } cout<<str<<endl; return 0;}
复制代码

25.单词替换

输入一个字符串,以回车结束(字符串长度不超过 100)。


该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。


现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。

输入格式

输入共 33 行。


第 1 行是包含多个单词的字符串 s;


第 2 行是待替换的单词 aa(长度不超过 100);


第 3 行是 a 将被替换的单词 bb(长度不超过 100)。

输出格式

共一行,输出将 s 中所有单词 a 替换成 b 之后的字符串。

输入样例:

You want someone to help youYouI
复制代码

输出样例:

I want someone to help you
复制代码

代码

这里用到了 stringstream ssin(s),在头文件 #include<sstream>中, <sstream>定义了三个类:istringstream、ostringstream 和 stringstream,分别用来进行流的输入、输出和输入输出操作。<sstream>主要用来进行**数据类型转换。**比 sscanf,sprintf 更加安全。

stringstream 函数

基本用法:


#include<iostream>#include<sstream>using namespace std;int main{    string s;    getline(cin,s);    stringstream ssin(s);    //将string s初始化为一个字符串流,定义完后将ssin当作cin就可以了    //和cin几乎一样,不同的是在s字符串中读取信息    int a,b;    string str;    double c;    ssin>>a>>str>>b>>c;    cout<<a<<endl<<str<<endl<<b<<endl<<c<<endl;    return 0;}
复制代码


  • 格式是 stringstream ssin; ssin<<s; s 是个字符串,s 通常用 getline(cin,s)来获得。

  • 此时的 ssin 相当于一个缓冲区,保存了字符串里面的所有字符。

  • 然后可以通过 ssin>>a;把字符串赋给 a,a 可以是各种类型的,会跳过空格,与 cin 相似


#include<bits/stdc++.h>using namespace std;
int main(){ string s,a,b; getline(cin,s); cin>>a>>b; stringstream ssin(s); string str; //stringstream ssin(s); //定义一个字符串输入流的对象ssin,并调用ssin的复制构造函数,将s中所包含的字符串放入ssin对象中 while(ssin >> str) if(str == a)cout<<b<<' '; else cout<< str << ' '; return 0;}
复制代码


发布于: 刚刚阅读数: 3
用户头像

timerring

关注

还未添加个人签名 2022.07.14 加入

还未添加个人简介

评论

发布
暂无评论
每日算法刷题Day7-比较字符串大小,去掉多余的空格,单词替换_算法_timerring_InfoQ写作社区