编程生活day6--回文子串、蛇形填充数组、笨小猴、单词排序

news2024/11/17 13:39:44

回文子串

题目描述

给定一个字符串,输出所有长度至少为2的回文子串。

回文子串即从左往右输出和从右往左输出结果是一样的字符串,比如:abba,cccdeedccc都是回文字符串。

输入

一个字符串,由字母或数字组成。长度500以内。

输出

输出所有的回文子串,每个子串一行。
子串长度小的优先输出,若长度相等,则出现位置靠左的优先输出。

样例输入

123321125775165561

样例输出

33
11
77
55
2332
2112
5775
6556
123321
165561

解题思路:

·看到题目的第一个反应是要写一个判断回文的函数

·题目的输出说,要从小的字符串输出,然后再从靠左的优先输出

·因为要形成回文字符串,所以最小长度为2,长度再逐渐增加,但是这样还不能满足题意

·再定义一个起点i,从0开始,如果与len相加等于字符串长度,则终止遍历

纯文字说,可能比较抽象,大家可以直接看代码

代码如下:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

bool huiwen(const string& s, int l, int r) {//判断是否是回文
	while (l <= r) {
		if (s[l] != s[r]) return false;
		l++;
		r--;
	}
	return true;
}
void findAll(const string& s) {//寻找字符串中的所有子串
	int n = s.length();
	int len;
	for (int len = 2; len <= n; len++) {//为终点,从2开始
		for (int i = 0; i <= n - len; i++) {//为起点,终止条件为n-len防止越界
			if (huiwen(s, i, i + len - 1)) {
				cout << s.substr(i, len) << endl;//substr输出从i到len的字符串
			}
		}
	}
}
int main() {
	string str; cin >> str;
	findAll(str);
	return 0;
}

难点

·判断回文字符串的函数

·想不到如何使用两层循环进行遍历,并且定义他们的和终点

·substr函数的使用

总结

这算是一道有些上难度的题目了,第二个函数,如果大家有不明白的地方,可以代入准确数字进行演算,即可知道为什么这样写了,而且也很好推算出来。其实第二个函数可以继续优化,使用双指针法进行求解,可以提高运行速度


蛇形填充数组

题目描述:

用数字1,2,3,4,...,n*n这n2个数蛇形填充规模为n*n的方阵。

蛇形填充方法为:

对于每一条左下-右上的斜线,从左上到右下依次编号1,2,...,2n-1;按编号从小到大的顺序,将数字从小到大填入各条斜线,其中编号为奇数的从左下向右上填写,编号为偶数的从右上到左下填写。

比如n=4时,方阵填充为如下形式:

1  2  6  7
3  5  8  13
4  9  12 14
10 11 15 16

输入

输入一个不大于10的正整数n,表示方阵的行数。

输出

输出该方阵,相邻两个元素之间用单个空格间隔。

样例输入

4

样例输出

1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16

解题思路

·这道题我们需要将数组分为两部分进行输出,上半部分以及下半部分

·定义一个flag进行判断数组是斜向上遍历(flag = 0),还是斜向下遍历(flag = 1)

·我们要找到斜向上输出的循环不变量,以及斜向下输出的循环不变量,通过画图观察可以知道

如图是上半部分输出图,可以观察得出,斜向上的数组中,列的起初值不变,斜向下的数组中,行的初始值不变

·再看下半部分

依旧与上半部一样的情况,只不过初始值进行了改变,但方法并未改变

代码如下:

#include <iostream>

using namespace std;

int main() {
	int i = 1, j = 1, x = 1, flag = 0, n; cin >> n;
	int a[20][20];
	for (int k = 1; k <= n; k++) {
		if (flag == 0) {//斜向上遍历
			i = k, j = 1;//斜向上初始位置,j不变
			while (i != 0) {//防止越界
				a[i][j] = x++;
				i--, j++;//斜向上遍历
			}
			flag = 1;//修改为斜向下遍历
		}
		else {//斜向上
			i = 1, j = k;//斜向下初始位置,i不变
			while (j != 0) {//防止越界
				a[i][j] = x++;
				i++, j--;//斜向下遍历
			}
			flag = 0;//修改为斜向上遍历
		}
	}
	for (int k = 2; k <= n; k++) {//与上半部分方法一致
		if (flag == 0) {
			i = n, j = k;
			while (j != n + 1) {
				a[i][j] = x++;
				i--, j++;
			}
			flag = 1;
		}
		else {
			i = k, j = n;
			while (i != n + 1) {
				a[i][j] = x++;
				i++, j--;
			}
			flag = 0;
		}
	}
	for (int i = 1; i <= n; i++) {//输出数组
		for (int j = 1; j <= n; j++) {
			cout << a[i][j] << " ";
		}
		cout << endl;
	}
}

难点

·盲目寻找数字规律,没有找图像规律

·不知道怎么定义边界

·没有找到循环过程中的循环不变量

总结

输出蛇形数组,还是一道比较经典二位数组的题目,比较考察逻辑思维能力,可能在做这题之前没有什么思路,或则思路比较乱,但是看了题目之后,思路就会比较清晰了,这是一道经典的基础题,同学们一定要掌握


笨小猴

题目描述

笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!

这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案。

输入

只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100。

输出

共两行,第一行是一个字符串,假设输入的的单词是Lucky Word,那么输出“Lucky Word”,否则输出“No Answer”;
第二行是一个整数,如果输入单词是Lucky Word,输出maxn-minn的值,否则输出0。

样例输入

样例 #1:
error

样例 #2:
olympic

样例输出

样例 #1:
Lucky Word
2

样例 #2:
No Answer
0

提示

单词error中出现最多的字母r出现了3次,出现次数最少的字母出现了1次,3-1=2,2是质数。
单词olympic中出现最多的字母i出现了2次,出现次数最少的字母出现了1次,2-1=1,1不是质数。

解题思路

·有的同学可能会有思路,就是将每个字母存入数组中,再寻找最大值和最小值,这样确实可以书写出来,现在,我要教大家一种更简便的方法

·使用count()函数,可以直接将字符数组中的每个单词出现的次数直接统计出,就可以方便很多

·剩下的只需要写一个判断素数的函数了

代码如下

#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;

bool isprime(int n) {//判断素数,如果是使用C++的同学,一定要使用cmath这个头文件
	if (n <= 1) return false;
	for (int i = 2; i <= sqrt(n); i++) {
		if (n % i == 0) return false;
	}
	return true;
}
int MaxMin(string s) {//统计出现次数最多和最少的字母
	int maxn = 0, minn = 101;
	for (int i = 0; i < s.size(); i++) {
		int cnt = count(s.begin(), s.end(), s[i]);
		if (cnt > maxn)
			maxn = cnt;
		if (cnt < minn)
			minn = cnt;
	}
	return maxn - minn;
}
int main() {
	string s; cin >> s;
	int ans = MaxMin(s);
	if (isprime(ans)) {
		cout << "Lucky Word" << endl;
		cout << ans;
	}
	else {
		cout << "No Answer" << endl;
		cout << 0;
	}
	return 0;
}

易错点

·不会书写判断素数的函数

·对count函数使用的不熟练

总结

如果知道方法,那么这道题就是一个简单题,但是如果不知道方法,就会复杂一些,所有要多做题,多见识一些方法,这样才能更快的进行求解


单词排序

题目描述

输入一行单词序列,相邻单词之间由1个或多个空格间隔,请按照字典序输出这些单词,要求重复的单词只输出一次。(区分大小写)

输入

一行单词序列,最少1个单词,最多100个单词,每个单词长度不超过50,单词之间用至少1个空格间隔。数据不含除字母、空格外的其他字符。

输出

按字典序输出这些单词,重复的单词只输出一次。

样例输入

She  wants  to go to Peking University to study  Chinese

样例输出

Chinese
Peking
She
University
go
study
to
wants

解题思路

·很多同学可能第一思路就是,创建字符数组,把每个数组存入,再求每个单词的头字母的ascii码值,以此进行排序,但是题目还有说要只输出一次,说实话,这么多条件在这,直接毁灭吧,下一题算了

·其实可以使用函数以及set进行求解,可以实现单词的比较,排序以及去重

·使用sstream对单词进行分割,再存入set中,因为set自动实现排序以及去重,再输出即可

代码如下

#include <iostream>
#include <set>
#include <sstream>
#include <string>

using namespace std;

int main() {
	string line; getline(cin, line);
	set<string> s;//定义集合
	string word;
	stringstream ss(line);//将字符串分割成单词,存在ss中
	while (ss >> word) {//读取单词
		s.insert(word);//将单个单词存入集合中
	}
	for (auto w : s) {
		cout << w << endl;//输出集合中的元素
	}
}

难点

·不知道使用sstream

·不知道set的使用,部分同学只知道set可以去重,而不知道可以排序

总结

本题也没有什么代码或者逻辑的难度,只是单纯的提供了一种解题方法,以及工具的使用方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1567855.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

剖析C++中的菱形继承

剖析C中的菱形继承 文章目录 剖析C中的菱形继承前言菱形继承虚拟继承与虚基表总结 前言 在面向对象编程中&#xff0c;继承允许我们构建出复杂的类关系和对象模型。然而&#xff0c;当多个类继承自同一个基类时&#xff0c;可能会引发结构上的冲突和数据冗余。这种情况在C中被…

基于深度学习的番茄新鲜度检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;本文深入研究了基于YOLOv8/v7/v6/v5的番茄新鲜度检测系统&#xff0c;核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法&#xff0c;进行性能指标对比&#xff1b;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码&#xff0c;及基于Streaml…

Dockerfile详解构建镜像

Dockerfile构建企业级镜像 在服务器上可以通过源码或rpm方式部署Nginx服务&#xff0c;但不利于大规模的部署。为提高效率&#xff0c;可以通过Dockerfile的方式将Nginx服务封装到镜像中&#xff0c;然后Docker基于镜像快速启动容器&#xff0c;实现服务的快速部署。 Dockerf…

Python机器学习实验 Python 数据分析

1.实验目的 掌握常见数据预处理方法&#xff0c;熟练运用数据分析方法&#xff0c;并掌握 Python 中的 Numpy、 Pandas 模块提供的数据分析方法。 2.实验内容 1. Pandas 基本数据处理 使用 Pandas 模块&#xff0c;完成以下操作。 &#xff08;1&#xff09;创建一个由 0 到 50…

Stable Diffusion 本地化部署

一、前言 最近在家背八股文背诵得快吐了&#xff0c;烦闷的时候&#xff0c;看到使用 AI 进行作图&#xff0c;可以使用本地话部署。刚好自己家里的电脑&#xff0c;之前买来玩暗黑4&#xff0c;配置相对来说来可以&#xff0c;就拿来试试。 此篇是按照 Github 上的 stable-d…

【智能算法】磷虾群算法(KHA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2012年&#xff0c;Gandomi等人受到自然界中磷虾生存行为启发&#xff0c;提出了磷虾群算法&#xff08;Krill Herd Algorithm, KHA&#xff09;。 2.算法原理 2.1算法思想 KHA受南极鳞虾群觅食行…

软件测试用例(2)

具体的设计方法 -- 黑盒测试 因果图 因果图是一种简化的逻辑图, 能直观地表明程序的输入条件(原因)和输出动作(结果)之间的相互关系. 因果图法是借助图形来设计测试用例的一种系统方法, 特别适用于被测试程序具有多种输入条件, 程序的输出又依赖于输入条件的各种情况. 因果图…

【C++】C++11类的新功能

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 默认成员函数 类成…

2024年阿里云服务器购买、续费、升级优惠活动价格表

2024年阿里云服务器租用费用&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核4G服务…

计算机网络——32差错检测和纠正

差错检测和纠正 错误检测 EDC 差错检测和纠错位&#xff08;冗余位&#xff09; D 数据由差错检测保护&#xff0c;可以包含头部字段 错误检测不是100%可靠的 协议会泄露一些错误&#xff0c;但是很少更长的EDC字段可以得到更好的检测和纠正效果 奇偶校验 单bit奇偶校验 …

【办公类-47-01】20240404 Word内部照片批量缩小长宽(课题资料系列)

作品展示 背景需求 最近在做《运用Python优化3-6岁幼儿学习操作材料的实践研究》的课题研究资料&#xff08;上半学期和下半学期&#xff09;。 将CSDN里面相关的研究照片文字贴入Word后&#xff0c;就发现一张图片就占了A4竖版一页&#xff0c;太大了。我想把word里面的所有…

vue2源码解析——vue中如何进行依赖收集、响应式原理

vue每个组件实例vm都有一个渲染watcher。每个响应式对象的属性key都有一个dep对象。所谓的依赖收集&#xff0c;就是让每个属性记住它依赖的watcher。但是属性可能用在多个模板里&#xff0c;所以&#xff0c;一个属性可能对应多个watcher。因此&#xff0c;在vue2中&#xff0…

Qt + VS2017 创建一个简单的图片加载应用程序

简介&#xff1a; 本文介绍了如何使用Qt创建一个简单的图片加载应用程序。该应用程序可以打开图片文件并在界面上显示选定的图片&#xff0c;并保存用户上次选择的图片路径。 1. 创建项目&#xff1a; 首先&#xff0c;在VS中创建一个新的Qt Widgets应用程序项目&#xff0c;并…

Vulnhub:WESTWILD: 1.1

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 dirmap enm4ulinux sumbclient get flag1 ssh登录 提权 横向移动 get root 信息收集 arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 0…

Springboot Thymeleaf 实现数据添加、修改、查询、删除

1、引言 在Spring Boot中使用Thymeleaf模板引擎实现数据的添加、修改、查询和删除功能&#xff0c;通常步骤如下&#xff1a; 在Controller类中&#xff0c;定义处理HTTP请求的方法。创建Thymeleaf模板来处理表单的显示和数据的绑定。 2、用户数据添加 1、 在Controller类中…

2024年福建三支一扶报名指南—照片<100kb

2024年福建三支一扶报名指南—照片<100kb

目标检测——监控下的汽车

一、重要性及意义 首先&#xff0c;车辆检测技术是保证视频监控系统正常运行的基础。通过监控摄像头实时获取的图像&#xff0c;可以自动检测出图像中的车辆&#xff0c;并进行车辆类型的分类和识别。这对于优化城市交通管理、实现智能交通系统具有重要意义。此外&#xff0c;…

智能小车测速(3.26)

模块介绍&#xff1a; 接线&#xff1a; VCC -- 3.3V 不能接5V&#xff0c;否则遮挡一次会触发3次中断 OUT -- PB14 测速原理&#xff1a; cubeMX设置&#xff1a; PB14设置为gpio中断 打开定时器2&#xff0c;时钟来源设置为内部时钟&#xff0c;设置溢出时间1s&#xff0c…

通义灵码功能上线:编程挑战中Claude3(opus)领先一步

最近好多AI博主都在推荐通义灵码&#xff0c;我就下载下来体验了一下&#xff0c;而且目前通义灵码暂时不收费&#xff0c;而且还有一个推荐奖励的活动&#xff0c;活动内容如下&#xff1a; 邀请好友达到一定人数&#xff0c;有一些奖励。 我目前看到微软的Azure云有个语音转…

LabVIEW电力设备在线监测系统

LabVIEW电力设备在线监测系统 在电力行业中&#xff0c;变电站的稳定运行对于保障电力系统的安全性和可靠性至关重要。开发了一种基于LabVIEW软件开发的变电站电力设备在线监测系统&#xff0c;实时监控变电站内部的电力设备状态&#xff0c;确保电力传输的高效与安全。通过对…