破解闯关密码

闯关游戏需要破解一组密码,闯关组给出的有关密码的线索是:

  • 一个拥有密码所有元素的非负整数数组 password
  • 密码是 password 中所有元素拼接后得到的最小的一个数

请编写一个程序返回这个密码。

示例 1:

输入: password = [15, 8, 7]
输出: "1578"

示例 2:

输入: password = [0, 3, 30, 34, 5, 9]
输出: "03033459"

思路:

本题传达出的一个信号是:碰见这种感觉到有点没搞清楚怎么操作的题目,试着先手推一下示例

这个问题本质就是一个排序问题,怎么看出来的呢?

比如原数组是3、30、34、1、9

3和30的位置应该互换,因为 330 大于 303 ----> 30、3、34、1、9

3和34的位置不需要换,因为 334 小于 343 ----> 30、3、34、1、9

34和1的位置需要互换,因为 341 大于 134 ----> 30、3、1、34、9

34和9的位置不需要换,因为 349 小于 934 ----> 30、3、1、34、9

这样其实就是一次循环走完,但是发现,这个1,是不是应该放到第一位呢,所以,这样的循环还得再来几次吧,也就是说,我需要两层for循环。

这个过程是不是很眼熟???

冒泡排序!!!

对,就是冒泡,只是两个字符串互换位置的判断逻辑变了,不是简单的比大小,而是要根据两数拼接后的大小,再来调整位置。

所以归根结底就是一个排序问题。

所以怎么去优化算法,也就变成了采用哪种排序算法的问题了?先给出冒泡排序:

class Solution {
public String crackPassword(int[] password) {
String[] strs = new String[password.length];
for(int i = 0; i < password.length; i++){
strs[i] = String.valueOf(password[i]);
}
for(int i = 0; i < strs.length; i++){
for(int j = 0; j < strs.length - 1; j++){
if((strs[j] + strs[j+1]).compareTo(strs[j+1] + strs[j]) > 0){
String temp = strs[j];
strs[j] = strs[j+1];
strs[j+1] = temp;
}
}
}
StringBuilder builder = new StringBuilder();
for(int i = 0; i < strs.length; i++){
builder.append(strs[i]);
}
return builder.toString();
}
}

使用Arrays,sort()并自定义排序规则:

class Solution {
public String crackPassword(int[] password) {
String[] strs = new String[password.length];
for(int i = 0; i < password.length; i++){
strs[i] = String.valueOf(password[i]);
}
//使用Arrays.sort() 并指定排序的规则
Arrays.sort(strs,(a,b) -> (a + b).compareTo(b + a)); StringBuilder builder = new StringBuilder();
for(int i = 0; i < strs.length; i++){
builder.append(strs[i]);
}
return builder.toString();
}
}

使用快速排序

class Solution {
public String crackPassword(int[] password) {
String[] strs = new String[password.length]; // 将数字数组转换成字符串数组
for (int i = 0; i < password.length; i++) {
strs[i] = String.valueOf(password[i]);
} // 对字符串数组进行快速排序
quickSort(strs, 0, strs.length - 1); // 构建最终的字符串
StringBuilder builder = new StringBuilder();
for (String s : strs) {
builder.append(s);
} return builder.toString();
} // 快速排序函数
private void quickSort(String[] strs, int low, int high) {
if (low < high) {
int pivotIndex = partition(strs, low, high); // 获取基准元素的索引
quickSort(strs, low, pivotIndex - 1); // 对左半部分进行递归排序
quickSort(strs, pivotIndex + 1, high); // 对右半部分进行递归排序
}
} // 分区函数:选择一个基准元素,将数组分为两部分
private int partition(String[] strs, int low, int high) {
String pivot = strs[high]; // 选择最后一个元素为基准
int i = low - 1; // i 是较小元素的索引 for (int j = low; j < high; j++) {
// 如果当前元素按我们的比较规则小于基准元素,则交换
if ((strs[j] + pivot).compareTo(pivot + strs[j]) < 0) {
i++;
swap(strs, i, j);
}
}
swap(strs, i + 1, high); // 将基准元素放到正确的位置
return i + 1; // 返回基准元素的索引
} // 交换数组中两个元素
private void swap(String[] strs, int i, int j) {
String temp = strs[i];
strs[i] = strs[j];
strs[j] = temp;
}
}

LCR 164. 破解闯关密码的更多相关文章

  1. sql-lib闯关1-10关

    闯关之前我们需要搭建所需环境SQLi-Labs SQLi-Labs是一个专业的SQL注入练习平台,该平台包含了以下在测试场景中常见的注入类型: 1.报错注入(联合查询) ​     1)字符型 ​   ...

  2. 网页闯关游戏(riddle webgame)--SQL注入的潘多拉魔盒

    前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. web开发初学者往往会忽视一些常见的漏洞 ...

  3. 网页闯关游戏(riddle webgame)--游戏玩法和整体介绍

    前言: 记得上大学那会, 有位传说中的大牛, 写了一个网页闯关类的游戏. 当时我们玩得不亦乐乎, 也是第一次接触到这种形式的游戏. 不过当时纯玩家心态, 并没有想过去创造一个. 最近想起这事, 突然想 ...

  4. Pythonchallenge一起来闯关(二)

    前情提要:Pythonchallenge一起来闯关(一) 这一篇来闯关10-15.感觉这几关比先前的难了不少,有的题目完全没思路. 10. 页面源码中的链接点击后有a = [1, 11, 21, 12 ...

  5. 几种破解MySQL root密码的几种方法:

    几种破解MySQL root密码的几种方法: 方法一 使用phpmyadmin,这是最简单的了,修改mysql库的user表,不过别忘了使用PASSWord函数. 方法二 使用mysqladmin,这 ...

  6. <爬虫>黑板爬虫闯关02

    import requests from lxml import etree ''' 黑板爬虫闯关02 网址:http://www.heibanke.com/lesson/crawler_ex01/ ...

  7. sql-lib闯关11-20关

    从第11关开始,我们就进入到了POST注入的世界了. POSTpost是一种数据提交方式,它主要是指数据从客户端提交到服务器端,例如,我们常常使用的用户登录模块.网站的留言板模块等,在这些功能模块中我 ...

  8. CTFhub-WEB前置-http协议闯关

    前情提要: 在渗透学习过程中,web的基础知识很重要,在这里通过long long ago之前学习的http基础,并结合网上的CTFhub--WEB前置之http协议闯关,对web基础知识进行加固并查 ...

  9. 破解压缩文件密码rarcrack

    破解压缩文件密码rarcrack   常见的压缩文件格式有ZIP.RAR和7z.这三种格式都支持使用密码进行加密压缩.前面讲过破解ZIP压缩文件,可以使用fcrackzip.对于RAR和7z格式,可以 ...

  10. 网页闯关游戏(riddle webgame)--H5刮刮卡的原理和实践

    前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. 对于刮刮卡, 想必大家都很熟悉, 也很喜 ...

随机推荐

  1. 24暑集训Week1

    24暑集训Week1 夜行的人,若你不唱歌的话,不惊醒这黑夜的话,就永远也走不出呼蓝别斯了. 这重重的森林,这崎岖纤细的山路,这孤独疲惫的心. 亲爱的,哪怕后来去到了城市,走夜路时也要大声地唱歌,像喝 ...

  2. 基于Java+SpringBoot+Mysql实现的古诗词平台功能设计与实现四

    一.前言介绍: 1.1 项目摘要 随着信息技术的迅猛发展和数字化时代的到来,传统文化与现代科技的融合已成为一种趋势.古诗词作为中华民族的文化瑰宝,具有深厚的历史底蕴和独特的艺术魅力.然而,在现代社会中 ...

  3. .NET 创建动态方法方案及 Natasha V9

    前言 本篇文章前面客观评估了 .NET 创建动态方方案多个方面的优劣,后半部分是 Natasha V9 的新版特性. .NET 中创建动态方法的方案 创建动态方法的不同选择 以下陈列了几种创建动态方法 ...

  4. Apache Shiro 721反序列化漏洞复现

    目录 漏洞原理 复现 修复方式 漏洞原理 Shiro 的RememberMe Cookie使用的是 AES-128-CBC 模式加密.其中 128 表示密钥长度为128位,CBC 代表Cipher B ...

  5. JDBC【4】-- SPI底层原理解析

    前面已经讲过SPI的基本实现原理了,demo也基本实现了,再来说说SPI. http://aphysia.cn/archives/jdbcspi 背景:SPI是什么? SPI,即是Service Pr ...

  6. 设计模式:可复用面向对象软件的基础 pdf电子书分享

    <设计模式:可复用面向对象软件的基础>是引导读者走出软件设计迷宫的指路明灯,凝聚了软件开发界几十年设计经验的结晶.四位顶尖的面向对象领域专家精心选取了最具价值的设计实践,加以分类整理和命名 ...

  7. 案例 | 某药企引进正也科技S2P系统 整合营销业务

    为了获取更大的市场空间,医药健康行业正迎来一波前所未有的产业升级.尽管不少企业取得了许多成绩,但仍面临诸多挑战. 天津某医药公司是集医药研发.药品生产.医药商业.大健康产业于一体的大型企业.敢为人先开 ...

  8. (二)Springboot + vue + 达梦数据库构建RBAC权限模型前后端分离脚手架保姆级教程(后端项目)

    XX后台管理系统 Springboot + vue + dm8 的前后端分离项目,后端项目 https://spring.io https://start.aliyun.com 1. 创建项目 初始化 ...

  9. 数据库开发规范v1.0

    一.建表规约 [强制]表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint( 1 表示是,0 表示否). 说明:任何字段如果为非负数,必须是 unsi ...

  10. 跨平台交叉编译 Native AOT

    如何将.NET 应用程序发布到鸿蒙上,肯定是很多人感兴趣的话题,目前.NET完全具备可以在OpenHarmony系统上运行的能力,.NET 现在有很多选项CoreCLR.Mono和NativeAOT. ...