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

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

在这里插入图片描述

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

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

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

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

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

输入格式

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

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

输出格式

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

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

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

输入样例:

Hello
hello

输出样例:

=

思路:

  • c_str是Borland封装的String类中的一个函数,它返回当前字符串的首字符地址。
  • 标准头文件包含操作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 you
You
I

输出样例:

I want someone to help you

代码

这里用到了stringstream ssin(s),在头文件#include中, 定义了三个类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。主要用来进行数据类型转换。比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月前
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
|
1月前
|
算法
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
76 1
两个字符串匹配出最长公共子序列算法
|
1月前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
14 0
|
3月前
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
|
3月前
|
算法 容器
【算法】滑动窗口——串联所有单词的子串
【算法】滑动窗口——串联所有单词的子串
|
3月前
【刷题记录】最大公因数,最小公倍数(辗转相除法、欧几里得算法)
【刷题记录】最大公因数,最小公倍数(辗转相除法、欧几里得算法)
|
3月前
|
算法 Python
【Leetcode刷题Python】改进的算法,高效求一个数的因子
一个高效的Python函数用于找出一个整数的所有因子,通过仅遍历到该数平方根的范围来优化性能。
38 0
|
3月前
|
算法 C++
惊爆!KPM算法背后的秘密武器:一行代码揭秘字符串最小周期的终极奥义,让你秒变编程界周期大师!
【8月更文挑战第4天】字符串最小周期问题旨在找出字符串中最短重复子串的长度。KPM(实为KMP,Knuth-Morris-Pratt)算法,虽主要用于字符串匹配,但其生成的前缀函数(next数组)也可用于求解最小周期。核心思想是构建LPS数组,记录模式串中每个位置的最长相等前后缀长度。对于长度为n的字符串S,其最小周期T可通过公式ans = n - LPS[n-1]求得。通过分析周期字符串的特性,可证明该方法的有效性。提供的C++示例代码展示了如何计算给定字符串的最小周期,体现了KPM算法在解决此类问题上的高效性。
81 0
|
26天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
11天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。