xtu oj 最多的可变换字符串

文章目录

  • 回顾
  • 解题思路
  • c 语言代码

回顾

  • A+B III
  • 问题 H: 三角数
  • 问题 G: 3个数
  • 等式 数组下标查询,降低时间复杂度
  • 1405 问题 E: 世界杯
  • xtu 数码串
  • xtu oj 神经网络
  • xtu oj 1167 逆序数(大数据)
  • xtu oj 原根
  • xtu oj 不定方程的正整数解

解题思路

冒泡排序模板

void sort(char arr[], int n) {  int i, j, temp;  for (i = 0; i < n-1; i++) {  for (j = 0; j < n-i-1; j++) {  if (arr[j] > arr[j+1]) {  // 交换 arr[j] 和 arr[j+1]  temp = arr[j];  arr[j] = arr[j+1];  arr[j+1] = temp;  }  }  }  
}  

下面贴一份过不了的代码,我不知道为啥过不了,问了几个朋友都没搞懂。思路是,我认为两个字符串排序之后完全相等,这两个字符串就互为可变字符串,先手写了一个冒泡排序,然后用一个临时数组存排序之前的字符串,比较完了之后再把临时数组的字符复制到原字符串数组,相当于做一个复原。

用一个数组 len 存每个字符串的长度,用一个数组 cnt 存当前字符串作为这一组可变字符串的第一个字符串,该组有多少个可变字符串。记录最大的 cnt 的值,还有这个 cnt 数组对应的下标,然后再查询出来。

#include<stdio.h>
#include<string.h>
#include<stdbool.h>//表示输入的数组,存字符串的
char a[110][15];
//表示当前组有多少个可变字符串,下标表示的是当前组的第一个可变字符串的 a 数组的下标,数值表示的是该组的可变字符串的数量
int cnt[110];
//字符串的长度
int len[110];//手写一个冒泡排序
void sort(char arr[], int n) {  int i, j, temp;  for (i = 0; i < n-1; i++) {  for (j = 0; j < n-i-1; j++) {  if (arr[j] > arr[j+1]) {  temp = arr[j];  arr[j] = arr[j+1];  arr[j+1] = temp;  }  }  }  
}  int main(){int t;scanf("%d",&t);while(t--){//输入字符串的数目, n 个字符串int n;scanf("%d",&n);//输入字符串,记录字符串的长度for(int i=0;i<n;i++){scanf("%s",a[i]);len[i]=strlen(a[i]);}//表示最多的可变字符串的数目int max_times=1;//表示最多的可变字符串的第一个字符串的位置int pos=0;//枚举每一个字符串for(int i=0;i<n;i++){//算从 i+1 到最后一个字符串,判断是不是可变字符串for(int j=i+1;j<n;j++){//临时数组存字符串,方便后面还原char temp[15];for(int k=0;k<len[j];k++){temp[k]=a[j][k];}//排序,排序之后比较,假设相等就表示两个字符串是互为可变字符串sort(a[j],len[j]);bool is_same=true;//假设两个字符串的长度不一样,肯定就不行if(len[i]!=len[j]){is_same=false;}else{for(int k=0;k<len[i];k++){if(a[i][k]!=a[j][k]){is_same=false;break;}}	}//假设两个字符串互为可变字符串就把计数器增加if(is_same){cnt[i]++;}//还原,方便下一次比较for(int k=0;k<len[j];k++){a[j][k]=temp[k];}}//维护最大的可变字符串的数目if(cnt[i]+1>max_times){max_times=cnt[i]+1;pos=i;}}//输出答案printf("%d\n",max_times);printf("%s\n",a[pos]);//重复上面的步骤,我们现在知道最多的可变字符串的那一组的第一个字符串,比较和这个字符串互为可变字符串的,输出,就是答案for(int j=pos+1;j<n;j++){char temp[15]={'\0'};for(int k=0;k<len[j];k++){temp[k]=a[j][k];}sort(a[j],len[j]);bool is_same=true;if(len[pos]!=len[j]){is_same=false;}else{for(int k=0;k<len[pos];k++){if(a[j][k]!=a[pos][k]){is_same=false;break;}}	}if(is_same){printf("%s\n",temp);}}puts("");//方便下一次输入for(int i=0;i<110;i++){cnt[i]=0;for(int j=0;j<15;j++){a[i][j]='\0';}}}return 0;
}

能过样例,过不了题,这让我非常郁闷。有读者能帮我找出上面代码的问题,欢迎评论或者私信我,我真的非常想知道上面的代码的问题出现在哪里。

朋友告诉我,统计字母出现的次数也可以,就是比较两个字符串出现字母的次数,假设两个字符串出现的字母次数是相等的,那么两个字符串可以认为是互为可变字符串。其他的思路和我上面的一样。

以后我写题解或者啥的,还是在代码里面写一些注释,感觉会好一些,我把代码发给朋友,请教他,把思路和代码都发给他,他说看不懂我的代码,以后我只要发出来的算法题代码,尽量写一写注释,毕竟一些变量名啥的,具体的意思,在代码旁边看可能更加的直观。

找到前面代码的问题了,现在改一下。

简单地说,就是把字符串排序,看两个字符串排序之后是不是完全相等,假设完全相等就说明两个字符串是同一组可变字符串。前面代码的问题在于,我把原字符串看成是排序好的字符串了。但是其实需要额外用一个数组存排序好的字符串。

然后就是一些更新操作,细节都在注释里面了。对笔者来说,二维字符串的输入,还有字符串一些函数的使用其实不是那么熟练。比如说 strlen 这个函数返回的是 unsigned int 或者 unsigned long long ,就是假设直接把 strlen 写在循环体里面会有编译警告,但是不影响,但是我还是习惯定义一个变量在循环体外面,没有警告会让自己安心一些。之前写的快速排序会把字符串长度改变,所以用的是一个数组把字符串长度存下来。可能是我的快速排序的模板有点问题。

c 语言代码

#include<stdio.h>
#include<string.h>
#include<stdbool.h>//表示输入的数组,存字符串的
char a[110][15];
//存排序之后的字符串
char tempa[110][15];
//表示当前组有多少个可变字符串,下标表示的是当前组的第一个可变字符串的 a 数组的下标,数值表示的是该组的可变字符串的数量
int cnt[110];
//字符串的长度
int len[110];//手写一个冒泡排序
void sort(char arr[], int n) {  int i, j, temp;  for (i = 0; i < n-1; i++) {  for (j = 0; j < n-i-1; j++) {  if (arr[j] > arr[j+1]) {  temp = arr[j];  arr[j] = arr[j+1];  arr[j+1] = temp;  }  }  }  
}  int main(){int t;scanf("%d",&t);while(t--){//输入字符串的数目, n 个字符串int n;scanf("%d",&n);//输入字符串,记录字符串的长度for(int i=0;i<n;i++){//输入二维数组scanf("%s",a[i]);//存每一个字符串的长度len[i]=strlen(a[i]);//把字符串存到另一个数组,并排序,因为我们要比较的是排序之后的字符串,但是又需要保留原来的字符串,上次考试好像考了这个函数//我当时不是很会用,用循环模拟的,这个函数是把后面的数组复制到前面,容易搞错strcpy(tempa[i],a[i]);sort(tempa[i],len[i]);}//表示最多的可变字符串的数目,最小也是一个,字符串自己int max_times=1;//表示最多的可变字符串的第一个字符串的位置//初始的时候就是第一个字符串的下标int pos=0;//枚举每一个字符串for(int i=0;i<n;i++){//算从 i+1 到最后一个字符串,判断是不是可变字符串for(int j=i+1;j<n;j++){//临时数组存字符串,方便后面还原char temp[15];for(int k=0;k<len[j];k++){temp[k]=a[j][k];}//排序,排序之后比较,假设相等就表示两个字符串是互为可变字符串sort(a[j],len[j]);bool is_same=true;//假设两个字符串的长度不一样,肯定就不行if(len[i]!=len[j]){is_same=false;}else{for(int k=0;k<len[i];k++){//注意这里是和排序之后的字符串去比较if(tempa[i][k]!=a[j][k]){is_same=false;break;}}	}//假设两个字符串互为可变字符串就把计数器增加if(is_same){cnt[i]++;}//还原,方便下一次比较for(int k=0;k<len[j];k++){a[j][k]=temp[k];}}//维护最大的可变字符串的数目//加一是因为,比如说 abc 是第一个字符串,bca 是第二个字符串,我们计数器只会记录 1 ,但是实际上要把 abc 这个第一个字符串算上//相当于没算上第一个字符串,所以要加上if(cnt[i]+1>max_times){max_times=cnt[i]+1;pos=i;}}//输出答案printf("%d\n",max_times);printf("%s\n",a[pos]);//重复上面的步骤,我们现在知道最多的可变字符串的那一组的第一个字符串,比较和这个字符串互为可变字符串的,输出,就是答案for(int j=pos+1;j<n;j++){char temp[15]={'\0'};for(int k=0;k<len[j];k++){temp[k]=a[j][k];}sort(a[j],len[j]);bool is_same=true;if(len[pos]!=len[j]){is_same=false;}else{for(int k=0;k<len[pos];k++){if(a[j][k]!=tempa[pos][k]){is_same=false;break;}}	}if(is_same){printf("%s\n",temp);}}//换行puts("");//清空数组,方便下一个样例for(int i=0;i<110;i++){cnt[i]=0;for(int j=0;j<15;j++){a[i][j]='\0';}}}return 0;
}

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

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

相关文章

华为云CodeArts Pipeline架构与内容双重优化,高效助力持续交付!

点击下方链接进入帮助中心 成长地图_流水线 CodeArts Pipeline_华为云

unity学习-全局光照(GI)

在全局光照&#xff08;Lighting&#xff09;界面有两个选项 Realtime Light&#xff08;实时光照&#xff09;&#xff1a;在项目中会提前计算好光照以及阴影的程序&#xff0c;当你需要调用实时全局光照的时候会将程序调用出来使用 Mixed Light&#xff08;烘焙光照&#x…

HBuilder X 中Vue.js基础使用1(三)

一、 模板语法 Vue 使用一种基于 HTML 的模板语法&#xff0c;使我们能够声明式地将其组件实例的数据绑定到呈现的 DOM 上。所有的 Vue 模板都是语法层面合法的 HTML&#xff0c;可以被符合规范的浏览器和 HTML 解析器解析。 英文官网: Vue.js - The Progressive JavaScript Fr…

DPRNN 学习

DPRNN介绍 双路径循环语音分离神经网络&#xff08;Dual-Path RNN&#xff09;由三个处理阶段组成, 编码器、分离和解码器。首先&#xff0c;编码器模块用于将混合波形的短段转换为它们在中间特征空间中的对应表示。然后&#xff0c;该表示用于在每个时间步估计每个源的乘法函…

HCIP-HarmonyOS Application Developer 习题(十四)

&#xff08;多选&#xff09;1、HarmonyOs为应用提供丰富的Al(Artificial Intelligence)能力&#xff0c;支持开箱即用。下列哪些是它拥有的AI能力? A、通用文字识别 B、词性标注 C、实体识别 D、语音播报 答案&#xff1a;ABCD 分析&#xff1a; AI能力简介二维码生成根据开…

(JAVA)贪心算法、加权有向图与求得最短路径的基本论述与实现

1. 贪心算法 1.1 贪心算法的概述&#xff1a; 贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。 贪心算法的特点是一步一步地进行&#xff0c;常以当前情况为基础根据某个优化测度作最优选择&#xff0c;而不考虑各种可能的整体情况&#xff0c;省去了为找最优…

【深度学习中的注意力机制6】11种主流注意力机制112个创新研究paper+代码——加性注意力(Additive Attention)

【深度学习中的注意力机制6】11种主流注意力机制112个创新研究paper代码——加性注意力&#xff08;Additive Attention&#xff09; 【深度学习中的注意力机制6】11种主流注意力机制112个创新研究paper代码——加性注意力&#xff08;Additive Attention&#xff09; 文章目录…

【C#】调用本机AI大模型流式返回

【python】AI Navigator的使用及搭建本机大模型_anaconda ai navigator-CSDN博客 【Python】AI Navigator对话流式输出_python ai流式返回-CSDN博客 前两章节我们讲解了使用AI Navigator软件搭建本机大模型&#xff0c;并使用python对大模型api进行调用&#xff0c;使其流式返…

“智能科研写作:结合AI与ChatGPT提升SCI论文和基金申请质量“

基于AI辅助下的高效高质量SCI论文撰写及投稿实践 科学研究的核心在于将复杂的思想和实验成果通过严谨的写作有效地传递给学术界和工业界。对于研究生、青年学者及科研人员&#xff0c;如何高效撰写和发表SCI论文&#xff0c;成为提升学术水平和科研成果的重要环节。系统掌握从…

SAP_FICO模块-资产减值功能对折旧和残值的影响

一、业务背景 由于财务同事没注意&#xff0c;用总账给资产多做了一笔凭证&#xff0c;导致该资产金额虚增&#xff0c;每个月的折旧金额也虚增&#xff1b;现在财务的需求是怎么操作可以进行资产减值&#xff0c;并且减少每个月计提的折旧&#xff1b; 二、实现方式 通过事务码…

qt EventFilter用途详解

一、概述 EventFilter是QObject类的一个事件过滤器&#xff0c;当使用installEventFilter方法为某个对象安装事件过滤器时&#xff0c;该对象的eventFilter函数就会被调用。通过重写eventFilter方法&#xff0c;开发者可以在事件处理过程中进行拦截和处理&#xff0c;实现对事…

go 语言 Gin Web 框架的实现原理探究

Gin 是一个用 Go (Golang) 编写的 Web 框架&#xff0c;性能极优&#xff0c;具有快速、支持中间件、crash处理、json验证、路由组、错误管理、内存渲染、可扩展性等特点。 官网地址&#xff1a;https://gin-gonic.com/ 源码地址&#xff1a;https://github.com/gin-gonic/gi…

Shell重定向输入输出

我的后端学习大纲 我的Linux学习大纲 重定向介绍 标准输入介绍 从键盘读取用户输入的数据&#xff0c;然后再把数据拿到Shell程序中使用&#xff1b; 标准输出介绍 Shell程序产生的数据&#xff0c;这些数据一般都是呈现到显示器上供用户浏览查看; 默认输入输出文件 每个…

前OpenAI首席技术官为新AI初创公司筹资;我国发布首个应用临床眼科大模型 “伏羲慧眼”|AI日报

文章推荐 2024人工智能报告.zip &#xff5c;一文迅速了解今年的AI界都发生了什么&#xff1f; 今日热点 据报道&#xff0c;前OpenAI首席技术官Mira Murati正在为一家新的AI初创公司筹集资金 据路透社报道&#xff0c;上个月宣布离职的OpenAI首席技术官Mira Murati正在为一…

栈和队列(一)

栈和队列的定义和特点 栈和队列是一种特殊的线性表&#xff0c;只能在表的端点进行操作 栈的定义和特点 这就是栈的结构&#xff0c;是一个特殊的线性表&#xff0c;只能在栈顶&#xff08;或者说是表尾&#xff09;进行操作。其中top为栈顶&#xff0c;base为栈底 栈s的存储…

华为:高级ACL 特定ip访问特定ip命令

网络拓扑图&#xff1a; 网络环境&#xff1a; 全网互通即可 1.创建一个名为test的高级ACL acl name test advance 2.添加规则 ##拒绝所有ip访问 rule 10 deny ip source any destination 192.168.1.10 0.0.0.0 只允许特定ip访问特定ip rule 5 permit ip source 192.168.2.10…

【Vulnhub靶场】Kioptrix Level 5

目标 本地IP&#xff1a;192.168.118.128 目标IP&#xff1a;192.168.118.0/24 信息收集 nmap探测存活主机&#xff0c;扫全端口&#xff0c;扫服务 首先探测到目标ip为&#xff1a;192.168.118.136 nmap -sP 192.168.118.0/24nmap -p- 192.168.118.136nmap -sV -A 192.168.…

BurpSuite渗透工具的简单使用

BurpSuite渗透工具 用Burp Suite修改请求 step1&#xff1a; 安装Burp Suite。官网链接&#xff1a;Burp Suite官网 step2&#xff1a; 设置代理 step3&#xff1a; 如果要拦截https请求&#xff0c;还需要在客户端安装证书 step4&#xff1a; 拦截到请求可以在Proxy ->…

【嵌入式实时操作系统开发】智能家居入门4(FreeRTOS、MQTT服务器、MQTT协议、STM32、微信小程序)

前面已经发了智能家居入门的1、2、3了&#xff0c;在实际开发中一般都会使用到实时操作系统&#xff0c;这里就以FreeRTOS为例子&#xff0c;使用标准库。记录由裸机转到实时操作系统所遇到的问题以及总体流程。相较于裸机&#xff0c;系统实时性强了很多&#xff0c;小程序下发…

opencv环境配置-适配b站阿童木的opencv教程

首先&#xff0c;opencv作为一个库文件&#xff0c;目的是为了让更多人不需要学习底层像素操作就能上手视觉技术&#xff0c;所以他适配很多环境&#xff0c;目前电脑端我知道的就可以适配C语言 C Python MCU端就是openmv跟他最类似&#xff0c;还有个k210 canmv 阿童木教的…