字符串处理专题

2023-10-30

codeup习题

Problem A: 字符串连接

要求不使用库函数把两个字符串连接并输出。
非常简单。

#include<stdio.h>
int main(){
	char str1[110],str2[110];
	while(scanf("%s%s",str1,str2)!=EOF){
		int num1,num2;
		num1=num2=0;
		while(str1[num1]!='\0')num1++;
		while(str2[num2]!='\0')num2++;
		int i,j;
		for(i=num1,j=0;j<num2;i++,j++){
			str1[i]=str2[j];
		}
		str1[i]='\0';
		printf("%s\n",str1);
	}
	return 0;
}

Problem B: 首字母大写

对一个字符串中的所有单词,如果单词的首字母不是大写字母,则把单词的首字母变成大写字母。
在字符串中,单词之间通过空白符分隔,空白符包括:空格(’ ‘)、制表符(’\t’)、回车符(’\r’)、换行符(’\n’)。
注意如果首字母本身就是大写则无需转变,另题意表达不清,实际上只有’ '和‘\t’两种类型。

#include<iostream>
#include<string.h>
using namespace std;
int main(){
	char str[100];
	while(cin.getline(str,100)){
		int len=strlen(str);
		for(int i=0;i<len;i++){
			if(i==0&&(str[i]>='a'&&str[i]<='z')){
				str[i]+='A'-'a';
			}
			if((str[i]==' '||str[i]=='\t')&&(str[i+1]>='a'&&str[i+1]<='z')){
				str[i+1]+='A'-'a';
			}
		}
		cout<<str<<endl;
	}

	return 0;
}

Problem C: 字符串的查找删除 ※

给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串。
输入只有1组数据。
输入一个短字符串(不含空格),再输入若干字符串直到文件结束为止。
删除输入的短字符串(不区分大小写)并去掉空格,输出。
这道题就是用简单模式匹配来做,要注意的是,首先不区分大小写,因此先把短字符串转换为小写字母,但长字符串输出的时候要求大小写和输入一样,因此用一个tmp来存储转换为小写之后的字符用以比较。

#include<iostream>
#include<string.h>
using namespace std;
int main(){
	char s[110];
	char str[110][110];
	gets(s);
	int i;
	for(i=0;s[i]!='\0';i++){
		if(s[i]>='A'&&s[i]<='Z')
			s[i]+='a'-'A';
	}
	i=0;
	char tmp;
	int j,k,t;
	while(gets(str[i])){
		for(j=0;str[i][j]!='\0';j++){
			for(t=j,k=0;s[k]!='\0';t++,k++){
				if(str[i][t]>='A'&&str[i][t]<='Z'){
					tmp=str[i][t]+'a'-'A';
				}
				else
					tmp=str[i][t];
				if(tmp!=s[k])
					break;
			}
			if(s[k]=='\0'){
				j+=strlen(s)-1;
			}
			else if(str[i][j]!=' ')
				putchar(str[i][j]);
		}
		cout<<endl;
		i++;
	}
	return 0;
}

Problem D:单词替换 ※

输入一个字符串,以回车结束(字符串长度<=100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。
多组数据。每组数据输入包括3行,
第1行是包含多个单词的字符串 s,
第2行是待替换的单词a,(长度<=100)
第3行是a将被替换的单词b。(长度<=100)
s, a, b 最前面和最后面都没有空格。

这道题的测试用例没有考虑例如a只是出现在一个单词中的情况,而是简化为只要出现a就替换为b。实现上要简单很多。

#include<iostream>
#include<string>
using namespace std;
int main(){
	string str;
	string a;
	string b;
	int t;
	while(getline(cin,str)){
		cin>>a;
		cin>>b;
		t=0;
		while(str.find(a,t)!=string::npos){//检测字符串中所有欲查找的目标字符串
			t=str.find(a,t);
			str.replace(t,a.length(),b);
			t+=a.length();//这里用t++会导致内存超限
		}
		cout<<str<<endl;
		getchar();//注意在使用cin之后使用getline(sin,str)时要用getchar()吸收回车
	}
	return 0;
}

从网上找到的第二种方法,进行字符串的简单模式匹配,如果找到待替换字符串a,则输出b并在主串中跳过待替换字符串的长度;若未找到,则输出当前字符。

#include<iostream>
#include<string.h>
using namespace std;
int main(){
	char str[110];
	char a[110],b[110];
	int i,j,k;
	while(gets(str)){
		gets(a);
		gets(b);
		for(i=0;str[i]!='\0';i++){
			for(k=i,j=0;a[j]!='\0';k++,j++){
				if(str[k]!=a[j]){
					break;
				}
			}
			if(a[j]=='\0'){//若匹配成功,则跳过a输出b
				cout<<b;
				i+=strlen(a)-1;//注意for循环最后i会自增一,这里提前减去
			}
			else//若匹配不成功,则输出当前字符
				putchar(str[i]);
		}
		printf("\n");
	}
	return 0;
}

Problem E: 字符串去特定字符

输入字符串s和字符c,要求去掉s中所有的c字符,并输出结果。
此题目注意两点:一是字符串s可能含有空格,二是用printf输出空格需用getchar()吸收(gets()识别换行符作为结束标志)。

#include<iostream>
#include<string.h>
using namespace std;
int main(){
	char a[100];
	char c;
	int i,j;
	while(gets(a)){
		scanf("%c",&c);
		for(i=0;a[i]!='\0';){
			if(c==a[i]){
				for(j=i;a[j+1]!='\0';j++){
					a[j]=a[j+1];
				}
				a[j]='\0';
			}
			if(a[i]!=c){
				i++;
			}
		}
		printf("%s\n",a);
		//此处若不用getchar()吸收换行,则会被gets()识别导致出错
		getchar();
	}
	return 0;
}

Problem F:数组逆置

输入一个字符串,长度小于等于200,然后将数组逆置输出。
最简单的一个题。

#include<stdio.h>
int main(){
	char a[300];
	int i;
	while(gets(a)){
		for(i=0;a[i]!='\0';i++);//求字符串长度
		i--;
		for(;i>=0;i--){
			printf("%c",a[i]);
		}
		printf("\n");
	}
	return 0;
}

Problem G:比较字符串

比较两个字符串长度。非常简单。

#include<stdio.h>
int main(){
	int m;
	scanf("%d",&m);
	char a[60];
	char b[60];
	int i,j;
	while(m--){
		scanf("%s%s",a,b);
		for(i=0;a[i]!='\0';i++);
		for(j=0;b[j]!='\0';j++);
		if(i>j)
			printf("%s is longer than %s\n",a,b);
		else if(i<j)
			printf("%s is shorter than %s\n",a,b);
		else
			printf("%s is equal long to %s\n",a,b);
	}
	return 0;
}

Problem H:编排字符串

输入m个字符串,要求后输入的字符串排在前面,最多显示4 个字符串。
这道题直接用一个字符串数组每次读入字符串之后记录当前位置,再倒着往前输出直到达到四个字符串或者输出了所有输入的字符串为止。

#include<stdio.h>
int main(){
	int m;
	scanf("%d",&m);
	int i,j,t;
	char a[120][30];
	for(i=0;i<m;i++){
		t=i;
		scanf("%s",a[i]);
		for(j=0;j<=i&&j<4;j++){
			printf("%d=%s",j+1,a[t]);
			t--;
			if(j==i||j==3)
				printf("\n");
			else
				printf(" ");
		}
	}
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字符串处理专题 的相关文章

  • 静态链表

    代码来源 晴神 算法笔记 静态链表问题通用解题模板 定义静态链表 struct Node typename data int next XXX node size 使用静态链表时 结构体类型名和结构体变量名不要相同 初始化 XXX初始化为正
  • 有一段英文由若干个单词组成,单词之间用空格分隔,编写程序提取其中所有的单词

    一 问题描述 有一段英文由若干个单词组成 单词之间用空格分隔 编写程序提取其中所有的单词 二 问题解答 解析 这里需要用到STL在算法设计中的应用 STL在算法设计中的应用有如下几种 存放主数据 存放临时数据 检测数据元素的唯一性 数据的排
  • sprintf实例

    include
  • algorithm头文件下的常用函数

    max min abs max x y 和min x y 的两个参数可以是浮点数 abs x 的参数必须是整数 浮点型的绝对值要使用math头文件下的fabs swap reverse reverse it1 it2 可以将数组指针在 it
  • 算法笔记-图搜索

    统计图的连通分支数 思路 建图 搜索 注意这种建图方式是有向图 反例 1 2 3 4 4 1这种不会识别出来 因此建图时需要使用有向图 在add阶段加入两个方向的路径 add时从1开始的边的标号 0用来判断结束 斗则冲突有问题 int to
  • PAT题库代码(个人版本)~~持续更新,持续改进!

    引言 之前在网上看到浙江大学的题目系统PAT 想要刷一刷玩 目前是乙级题库 题目不多 持续更新 努力 话不多说 上代码 题目以及运行效果这里就不给出了 与PAT网站上的相同 1002 写出这个数 include
  • leetcode——探索字节跳动系列题目

    今天登陆leetcode发现探索区多了字节跳动的专栏 特意用了一下午去刷 有些是之前刷过的 但题目不错 就当是复习一遍吧 这里记录一下我会的以及自己觉得不错的题目 原题链接请点击题目 一 挑战字符串 3 无重复字符的最长子串 分析 这题要求
  • 一些常见数学问题的算法

    代码来源 晴神 算法笔记 一 最大公约数 int gcd int a int b if b 0 return a else return gcd b a b 二 最小公倍数 lcm a b ab d ab有可能溢出 因此更恰当的写法是a d
  • 算法笔记-第四章-第六章

    4 1排序 1 选择排序 思路 总共需要进行N趟操作 每次从i n中选出最小的元素并与第I个元素交换 算法的时间复杂度为O n2 假设有数组A i 0 lt i lt n 1 如下 void selectSort for int i 0 i
  • 有一个含n(n」2)个整数的数组a,判断其中是否存在出现次数超过所有元素一半的元素

    一 问题描述 有一个含n n gt 2 个整数的数组a 判断其中是否存在出现次数超过所有元素一半的元素 二 问题分析与解答 分析 可以先将数组a中的元素递增排序 再求出出现次数最多的次数maxnum 最后判断是否满足条件 代码实现 incl
  • C语言基础知识

    文章目录 基本数据类型 浮点数比较 常用math函数 循环结构 数组 结构体 字符串 基本数据类型 整型int 一个整数占用32位 bit 即4字节 Byte 取值范围 231 231 1 即绝对值109以内整数 长整型long long
  • FFT(快速傅里叶变换)算法

    文章目录 功能 一次FFT的功能 一次IFFT的功能 总体功能 前置技能 多项式的阶 多项式的系数表达式 多项式的点值表达式 复数 复数的基本单位 复数的运算 复平面 复根 定义 几个性质 求多项式乘积的基本步骤 FFT 递归版FFT 核心
  • python-爬虫-selenium总结

    爬虫 提示 写完文章后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 爬虫 前言 使用场景 一 前期准备工作 二 基本的操作 案例 使用selenium利用验证码识别平台 超级鹰 进行各种类型验证码验证 验证根据图像识别验证码输
  • 平衡二叉树(AVL树)

    平衡二叉树树专题 存储 基本操作 插入 代码来源 晴神 算法笔记 平衡二叉树定义 左右子树高度之差的绝对值不超过1 存储 struct node int data height node lchild rchild 新建结点 node ne
  • 算法➡数学问题

    文章目录 进制转换 最大公约数与最小公倍数 最大公约数 素数 判断素数 素数表的获取 质因子分解 大数运算 大数乘法 几何问题 由三点的坐标求所构成的三角形的面积 判断点是否在三角形内 集合问题 子集问题 数学归纳法 回溯法 全排列 进制转
  • 算法通过村第八关-树(深度优先)白银笔记

    文章目录 前言 1 最大深度问题 2 判断平衡树 3 最小深度 4 N叉树的最大深度 总结 前言 提示 我的整个生命 只是一场为了提升社会地位的低俗斗争 埃莱娜 费兰特 失踪的孩子 这一关我们看一些比较特别的题目 关于二叉树的深度和高度问题
  • 《算法导论》选择问题(找第K大的数)

    选择问题 Selection Problem 即在n个元素的集合中寻找第K小的元素的问题 第K小的元素又叫第K个顺序统计量 有以下几种变体 找最大值和最小值 同时找最大和最小值 找中位数 第n 2小 找任意第K小的元素 找Top K的元素
  • 斯坦福cs224n教程--- 学习笔记1

    一 前言 自然语言是人类智慧的结晶 自然语言处理是人工智能中最为困难的问题之一 而对自然语言处理的研究也是充满魅力和挑战的 通过经典的斯坦福cs224n教程 让我们一起和自然语言处理共舞 也希望大家能够在NLP领域有所成就 二 先修知识 学
  • 判断一个大于2的正整数n是否为素数的方法有多种,给出两种算法,说明其中一种算法更好的理由

    判断一个大于2的正整数n是否为素数的方法有多种 给出两种算法 说明其中一种算法更好的理由 问题解答 include
  • 算法设计与分析——算法设计工具Standard Template Library即STL(C++模板库)概述

    算法设计工具 STL 前言 STL是一个功能强大的基于模板的容器库 通过直接使用这些现成的标准化组件可以大大提高算法设计的效率和可靠性 一 STL构成 Container 容器 Algorithm 算法 Iterator 迭代器 二 什么是

随机推荐