破解闯关密码

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

  • 一个拥有密码所有元素的非负整数数组 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. 一款.NET开源的屏幕实时翻译工具

    前言 今天大姚给大家推荐一款.NET开源的屏幕实时翻译工具:Translumo. 工具介绍 Translumo是一个.NET开源的高级屏幕翻译工具,能够实时检测和翻译选定区域内的文本(如字幕).Tra ...

  2. 10-3 定制操作lambda

    目录 10.3.1 向算法传递函数 谓词 排序算法 10.3.2 lambda表达式 引入 介绍lambda 向lambda传递参数 使用捕获列表 调用find_if 使用for_each 完整的bi ...

  3. Linux /dev/loop0文件详解

    loop设备介绍 在类 UNIX 系统里,loop 设备是一种伪设备(pseudo-device),或者也可以说是仿真设备.它能使我们像块设备一样访问一个文件. 在使用之前,一个 loop 设备必须要 ...

  4. 斯坦福大学推出线性前沿LLM技术,训练模型成本仅为20美元

    序言:当前基于 Transformer 架构的大语言模型人工智能技术,由于投入大.成本高.人才需求苛刻,导致许多企业望而却步.动辄几千万甚至上亿的成本,现实中有几家企业能够承担?真正具有竞争力的技术应 ...

  5. Windows高级调试

    文档摘要: 本书<Windows高级调试>主要讲解Windows高级调试技术和工具,包括调试器简介.调试器揭密.符号文件与源文件的管理.栈内存破坏.堆内存破坏.安全.进程间通信.资源泄漏. ...

  6. Windows11 常用软件/环境安装记录

    Windows 编程 - The Tools I use 软件安装和管理 将软件装到统一一个地方,路径简短,不含空格和中文. WinGet 官方 Windows 软件包管理器 WinGet 在安装命令 ...

  7. ArrayList源码分析(基于JDK1.6)

    不积跬步,无以至千里:不积小流,无以成江海.从基础做起,一点点积累,加油! <Java集合类>中讲述了ArrayList的基础使用,本文将深入剖析ArrayList的内部结构及实现原理,以 ...

  8. Chrome插件之油猴(详尽版本)

    官方文档: https://www.tampermonkey.net/documentation.php#google_vignette 1.注释语法: // @match https://passp ...

  9. Nuxt.js 应用中的 webpack:progress 事件钩子

    title: Nuxt.js 应用中的 webpack:progress 事件钩子 date: 2024/11/27 updated: 2024/11/27 author: cmdragon exce ...

  10. 2024-11-27:字符串的分数。用go语言,给定一个字符串 s,我们可以定义其“分数”为相邻字符的 ASCII 码差值绝对值的总和。 请计算并返回字符串 s 的分数。 输入:s = “hello“

    2024-11-27:字符串的分数.用go语言,给定一个字符串 s,我们可以定义其"分数"为相邻字符的 ASCII 码差值绝对值的总和. 请计算并返回字符串 s 的分数. 输入:s ...