排序 (蓝桥杯) JAVA
目录
- 题目描述:
- 冒泡排序算法(排序数字,字符):
- String与String buffer的区别:
- 纯暴力破解(T到爆炸):
- 暴力破解加思考(bingo):
- 总结:
题目描述:
小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。 在冒泡排序中,每次只能交换相邻的两个元素。
小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符,则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。
例如,对于字符串lan 排序,只需要1 次交换。对于字符串qiao 排序,总共需要4 次交换。
小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要100 次交换,可是他忘了吧这个字符串记下来,现在找不到了。
请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对该串的字符排序,正好需要100
次交换。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。
这是一道结果填空的题,你只需要算出结果后提交即可。
本题的结果为一个只包含小写英文字母的字符串,在提交答案时只填写这个字符串,填写多余的内容将无法得分。
答案:jonmlkihgfedcba
冒泡排序算法(排序数字,字符):
理解:
冒泡排序的正序排序,整个实现过程,就类似气泡从水底,到水面的过程,即越到水面,气泡越大,在排序过程中也是如此,每次排序都会将数值最大的数,挪到数组后端。
冒泡排序正序排列数字代码如下:
public static void maopao(int a[]) {for(int i = 0; i < a.length; i ++)for(int j = 0; j < a.length - i - 1; j ++) {if(a[j] > a[j + 1]) { int temp = a[j];a[j] = a[j + 1];a[j + 1] = temp;}}}
冒泡排序正序排列字符代码如下:
public static void maopao(char a[]) {for(int i = 0; i < a.length; i ++)for(int j = 0; j < a.length - i - 1; j ++) {if(a[j] > a[j + 1]) { char temp = a[j];a[j] = a[j + 1];a[j + 1] = temp;}}}
String与String buffer的区别:
思路:
在暴力破解的代码中我用到了StringBuffer存储字符串,为什么不用String存储呢,因为String储存的字符串有时候不可变动,StringBuffer可以。以下为两者在被函数调用的区别:
代码:
import java.nio.Buffer;public class text {public static void main(String[] args) {StringBuffer s = new StringBuffer("abcd");String s1 = "abcd";add(s);add(s1);System.out.println(s);System.out.print(s1);}public static void add(String s) {s = s + 'A';}public static void add(StringBuffer s) {s.append('A');}}
输出:

可以看出,StringBuffer,被调用后内容更新了,而String 没有被更新
以下是StringBuffer 的一些基本函数的用法:
1. delete(0 , 1) : 删除[0 , 1)区间内的字符
2. insert (0, 'a') : 将字符 a 插入0的位置
3. appand( 'a' ) :将字符a添加到末尾。
纯暴力破解(T到爆炸):
解题思路:
所谓纯暴力,就是不加思索,直接用 dfs + 回溯思想,一个一个遍历直到找到符合条件的字符串。这里将冒泡排序进行了一些改进,让其能够记数:
冒泡排序记数代码如下:
public static int maopao(char a[]) {int sum = 0;for(int i = 0; i < a.length; i ++)for(int j = 0; j < a.length - i - 1; j ++) {if(a[j] > a[j + 1]) { char temp = a[j];a[j] = a[j + 1];a[j + 1] = temp;sum ++;}}return sum;}
纯暴力完整代码如下:
import java.util.*;public class Main{public static char a[] = new char[26];public static boolean b[] = new boolean[26];public static void main(String[] args){ a[0] = 'a';for(int i = 1; i <= 25; i ++) {a[i] = (char)(a[i - 1] + 1);}StringBuffer s = new StringBuffer("ihgfedcba");for(int i = 0; i < 26; i ++) {b[i] = true;dfs(a[i], s);b[i] = false;s = s.delete(0, 1);}}public static int maopao(char a[]) {int sum = 0;for(int i = 0; i < a.length; i ++)for(int j = 0; j < a.length - i - 1; j ++) {if(a[j] > a[j + 1]) { char temp = a[j];a[j] = a[j + 1];a[j + 1] = temp;sum ++;}}return sum;}public static void dfs(char d, StringBuffer s) {s = s.insert(0, d);String s1 = new String(s);char c[] = s1.toCharArray();if(maopao(c) == 100) {print(s);return;}for(int i = 0; i < 26; i ++) {if(b[i] == false) {b[i] = true;dfs(a[i], s);b[i] = false;s.delete(0, 1);}}}public static void print(StringBuffer s) {System.out.println(s);}
}
大家也别运行这个代码了,我粗略地算了一下,要得出结果至少要 26!/ 10^9 / 3600 = …小时。 😭数据太大了不足以用年来计量了😭我只能说我是真SB。
暴力破解加思考(bingo):
解题思路:
所以做这种填空题,纯暴力是吃力不讨好的,我们应该尽可能的大胆去思考,大胆去猜测,去举例论证,以减小我们搜索的范围。
1.首先明确题目要求,字符最少,且字典序最小,不能重复。
所以左端应该越接近a越好,例如:......dcba, 这种序列交换次数也很大,所以相应需要的字符也少。
对冒泡排序的核心代码进行分析:

对于上述推测的字符串类型,可以发现每次运行都会交换次序,我们可以用 cba,ba,带入冒泡排序去推规律,不难发现,交换次数 N = (x - 1 + x - 2 + x - 3 + … + 0)化简得到:N = x * (x - 1) / 2
可以算出 x = 15 时 N = 105。
也可以对上述纯暴力代码修改,让其输出,第一个大于 100 次交换次序的数列:
import java.util.*;public class Main{public static char a[] = new char[26];public static boolean b[] = new boolean[26];public static void main(String[] args){ a[0] = 'a';for(int i = 1; i <= 25; i ++) {a[i] = (char)(a[i - 1] + 1);}StringBuffer s = new StringBuffer("");for(int i = 0; i < 26; i ++) {b[i] = true;dfs(a[i], s);b[i] = false;s = s.delete(0, 1);}}public static int maopao(char a[]) {int sum = 0;for(int i = 0; i < a.length; i ++)for(int j = 0; j < a.length - i - 1; j ++) {if(a[j] > a[j + 1]) { char temp = a[j];a[j] = a[j + 1];a[j + 1] = temp;sum ++;}}return sum;}public static void dfs(char d, StringBuffer s) {s = s.insert(0, d);String s1 = new String(s);char c[] = s1.toCharArray();if(maopao(c) >= 100) {print(s);return;}for(int i = 0; i < 26; i ++) {if(b[i] == false) {b[i] = true;dfs(a[i], s);b[i] = false;s.delete(0, 1);}}}public static int k = 1;public static void print(StringBuffer s) {if(k > 0)System.out.println(s);k --;}
}
输出:

-那么问题来了,上述字符串的交换次序是105
要想让交换次序变成100,有两种方案,1. 让一个字符少换5次,2.让5个字符都少交换1次,整体少交换5次
1.让一个字符少交换5次 :
即把某个字符往前移动即可:
例如:
onmlkjihgfedcba
让 o少交换5次
得nmlkjoihgfedcba刚好交换次数为100
这种方式如果将最后一个字母向前移动的话,是可以将字典序变小的。
我们再来看看让五个字符都少交换1次的方法。
2.让五个字符都少交换1次,整体少交换5次 :
即将onmlkjihgfedcba中某个字符向后移动,这样其他字符就会少交换一次
为了让交换后的字典序尽可能小,且满足交换次序为100次,我们最好是将中间某个字符放到尾部,这样字典序就小的更多。
满足上述要求我们发现将j交换到尾部刚好能满足条件即:
jonmlkihgfedcba
也就是我们的最终答案
总结:
这道题难度不言而喻,思维量很大,对我来说很难。所以,我们不能小看蓝桥杯的小题,没有把握的填空题可能真的没必要钻牛角尖去s扣它不放,而导致后面大题能骗或者搞到分的地方没有时间。适当放弃就要放弃,等能得的分都得到了,再来会会它也不迟,这里更是提醒我自己,我本人就爱怒怼一道题s扣不放。要明白,我们的目的是尽可能得我们能得的分,而不是将所有题做对。把我们的努力成果好好的发挥出来。能够权衡什么是西瓜什么是芝麻并灵活应对也是一个合格程序员该具备的能力不是么?😁
相关文章:
排序 (蓝桥杯) JAVA
目录题目描述:冒泡排序算法(排序数字,字符):String与String buffer的区别:纯暴力破解(T到爆炸):暴力破解加思考(bingo):总结:题目描述: 小蓝最近学习了一些排序算法,其中冒泡排序让他…...
【Blender 水墨材质】实现过程剖析01
写在前面 想把Blender一位大佬演示的Blender水墨材质过程,在Unity用Shader重现,过程中会拿能拿到的节点代码举例(ShaderGraph或者UE的都会有)。第一步当然是要跟着人家做一遍!我会尽可能地分析一下每一步的原理~ 教程…...
代码随想录算法训练营第五十六天|583. 两个字符串的删除操作、72. 编辑距离
LeetCode 583 两个字符串的删除操作 题目链接:https://leetcode.cn/problems/delete-operation-for-two-strings/ 思路: 方法一:两个子串同时删除元素 dp数组的含义 dp[i][j]dp[i][j]dp[i][j]代表以i-1为结尾的字符串word1,和以j-1位结…...
【ArchLinux】【KDE】Archlinux的安装与使用
文章目录开头前言所需环境演示环境相关链接安装教程在Windows环境下制作启动盘进入ArchLinux Live环境安装为硬盘分区如何新建分区?分区表格式化分区分区完成,开始安装挂载分区切换镜像源安装基本系统设置将Live环境(当前)挂载信息…...
Go语言精修(尚硅谷笔记)第六章
六、函数、包和错误处理 6.1 函数概念 不用函数的弊端 1)写法可以完成功能, 但是代码冗余 2 ) 同时不利于代码维护 概念:为完成某一功能的程序指令(语句)的集合,称为函数。 在Go中,函数分为: 自定义函数、系统函数 基本语法 //函数的基本语法 fu…...
Photoshop的功能
Photoshop是一款功能强大的图片编辑软件,它提供了数百种不同的工具和特效,让您可以编辑图片、创建图形和设计网页等。 以下是Photoshop的一些主要功能: 1.图层:Photoshop允许您创建多个图层,让您可以在每一个图层上进…...
C++初阶——内存管理
目录 1. C/C内存分布 2. C语言中动态内存管理方式:malloc/calloc/realloc/free 3. C内存管理方式 3.1 new/delete操作内置类型 3.2 new和delete操作自定义类型 4. operator new与operator delete函数 重要 4.1 operator new与operator delete函数(…...
uds服务汇总
还有一些服务列举在下面: RequestDownload(服务ID为0x34)和RequestUpload(服务ID为0x35):这两个服务用于在ECU和诊断器之间进行数据传输。通过 RequestDownload服务,诊断器可以请求ECU接收一些数…...
【深度学习】2023李宏毅homework1作业一代码详解
研一刚入门深度学习的小白一枚,想记录自己学习代码的经过,理解每行代码的意思,这样整理方便日后复习也方便理清自己的思路。感觉每天时间都不够用了!!加油啦。 第一部分:导入模块 导入各个模块࿰…...
【软件测试】基础知识第二篇
文章目录一. 开发模型1. 瀑布模型2. 螺旋模型3. 增量和迭代模型3.1 增量模型3.2 迭代模型3.3 增量和迭代模型的区别4. 敏捷模型4.1 敏捷宣言4.2 scrum模型二. 开发模型V 模型W 模型一. 开发模型 1. 瀑布模型 瀑布模型在软件工程中占有重要地位,是所有其他模型的基…...
Java中File类以及初步认识流
1、File类操作文件或目录属性 (1)在Java程序中通过使用java.io包提供的一些接口和类,对计算机中的文件进行基本的操作,包括对文件和目录属性的操作、对文件读写的操作; (2)File对象既可以表示…...
【C语言】文件操作详细讲解
本章要分享的内容是C语言中文件操作的内容,为了方便大家学习,目录如下 目录 1.为什么要使用文件 2.什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3.文件的打开和关闭 3.1文件指针 3.2打开和关闭 4.文件的顺序读写 4.1顺序读写函数介绍…...
爱奇艺万能联播使用教程
众所周知,爱奇艺是百度旗下的一款产品,所以今天用爱奇艺万能联播的方法实现下载百度网盘,并没有破解百度网盘,是官方正版下载渠道。软件是官方版本,大家双击安装即可。 安装完成以后,在软件中就有了“访问网…...
真题讲解-软件设计(三十七)
数据流图DFD(真题讲解)-软件设计(三十六)https://blog.csdn.net/ke1ying/article/details/129803164 在网络安全管理中,加强内防内控可采取的策略是? 终端访问权限,防止合法终端越权访问。加强…...
Android 上的协程(第一部分):了解背景
本系列文章 Android 上的协程(第一部分):了解背景 Android 上的协程(第二部分):入门 Android上的协程 (第三部分): 实际应用 Android 上的协程(第一部分):了解背景 这篇…...
【H3C】VRRP2 及Vrrp3基本原理 华为同用
文章目录VRRP2基本概念报文格式主备选举规则(优先级)0和255双Master原因VRRP认证VRRP状态机抢占模式VRRP主备切换状态项目场景VRRP3H3C参考致谢VRRP2 基本概念 VRRP路由器(VRRP Router):运行VRRP的设备,它…...
【数据库】SQL语法
目录 1. 常用数据类型 2. 约束 3. 数据库操作 4. 数据表操作 查看表 创建表格 添加数据 删除数据 修改数据 单表查询数据 多表查询数据 模糊查询 关联查询 连接查询 数据查询的执行顺序 4. 内置函数 1. 常用数据类型 整型:int浮点型:flo…...
JavaEE简单示例——文件的上传和下载
文件的上传和下载的实现原理的简单介绍 表单的构成 首先,我们先来介绍我们的需要用到的表单,在这个表单中,首先值得我们注意的就是,在type为file的input标签中.这个控件是我们主要用来选择上传的文件的, 除此之外,我们要想实现文件的上传,还需要将method的属性的值设置为post…...
【C语言督学训练营 第五天】数组字符串相关知识
文章目录前言一、数组的定义1.一维数组①.如何定义②.声明规则③.内存分布④.初始化方法2.二维数组3.高维数组二、访问数组元素相关问题1.访问越界2.数组的传递三、Scanf与字符数组1.字符数组初始化2.scanf读取字符四、字符数组相关函数前言 今天的C语言训练营没有安排高维数组…...
GPT-4 免费体验方法
POE 在Quora上非常受欢迎的手机聊天机器人Poe App已经集成ChatGPT助手!除了最初集成的三个聊天机器人Sage、Claude和Dragonfly外,Poe现在还加入了第四位ChatGPT。由于使用了ChatGPT API,因此Poe拥有真正的ChatGPT。 现在更是第一批集成了GP…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
