[LeetCode][LCR164]破解闯关密码——重定义排序规则+贪心

2024-04-08 20:28

本文主要是介绍[LeetCode][LCR164]破解闯关密码——重定义排序规则+贪心,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1 题目
  • 2 思考
  • 3 解法1:自写快排
  • 4 解法2:为 sort() 函数提供自定义的排序规则
    • 4.1 如何为 sort() 函数提供自定义的排序规则:
    • 4.2 C++ 匿名函数的使用
      • 4.2.1 什么是lambda函数的捕获列表
    • 4.3 解法2代码

1 题目

LCR 164. 破解闯关密码

闯关游戏需要破解一组密码,闯关组给出的有关密码的线索是:一个拥有密码所有元素的非负整数数组 password,密码是 password 中所有元素拼接后得到的最小的一个数。请编写一个程序返回这个密码。

  • 示例 1:

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

  • 示例 2:

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

2 思考

  • 这道题的重点就是如何对数字们进行排序,按照一般的想法,就是放在前面的数字由于是在高位,所以应该放更小的数字
  • 但是这道题无法使用这种简单的方式进行排序,因为提供的数字位数不一样。如示例1中:“15” 是最大的,但是由于其可以在千位提供更小的 “1”,所以应该放最前面
  • 如果按每一个数字的每一个位依次去筛选,那时间复杂度将会很高,而且代码很难写
  • 其实回过头看,如果只有2个元素,最朴素的想法就是进行两次尝试:先把 a 放在 b 的前面,组成ab,再尝试组成ba,然后比较ab 和 ba,哪一个小哪一个就是正确的排序方式
  • 这种方式可以直接扩展到多个元素
  • 若拼接字符串 (x+y>y+x) ,则 x “大于” y;
  • 反之,若 (x+y<y+x) ,则 x “小于” y 。
    来源:https://leetcode.cn/leetbook/read/illustration-of-algorithm/lxm4ze/
  • 也就是如果 x+y>y+x,那么 x 应该放 y 的后面,如果 x+y<y+x,那么 x 就应该放在 y 的前面

3 解法1:自写快排

class Solution {
public:string crackPassword(vector<int>& password) {vector<string> strs;for(auto &ele:password){strs.push_back(to_string(ele));}quickSort(strs, 0, strs.size()-1);string ans;for(auto &ele:strs){ans +=ele;}return ans;}void quickSort(vector<string>& str, int l, int r){if(l>=r) return;int i=l, j=r;while(i<j){while(i<j && str[j]+str[l]>=str[l]+str[j]) --j;while(i<j && str[i]+str[l]<=str[l]+str[i]) ++i;swap(str[i], str[j]);}swap(str[i], str[l]);quickSort(str, l, i-1);quickSort(str, i+1, r);}
};

  • 上面的代码中,直接对拼接后的字符串的字典序进行了比较,是按照每个字符的ASCII码值来逐个比较两个字符串的大小的,当此位比较结果相同时,则进行下一位的比较
  • 由于是从最高位开始比较的,因此直接比较字符串就可以得到两个数的大小比较结果,而无需转为 int 进行比较

4 解法2:为 sort() 函数提供自定义的排序规则

4.1 如何为 sort() 函数提供自定义的排序规则:

bool customCompare(int a, int b) {// 自定义排序规则,这里以升序排序为例return a < b;
}int main() {vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5}; // 示例容器// 使用比较函数进行排序sort(vec.begin(), vec.end(), customCompare);// 输出已排序的结果for (int num : vec) {cout << num << " ";}return 0;
}

4.2 C++ 匿名函数的使用

在 C++ 中,lambda 函数的一般语法模板如下:

[capture](parameters) -> return_type { // 函数体 
}
  • capture 是一个可选部分,用于捕获外部变量,可以为空([])或包含指定的变量。例如,[x, &y] 表示按值捕获变量 x,按引用捕获变量 y。
  • parameters 是参数列表,与普通函数的参数列表类似。
  • return_type 是返回类型。在 C++11 中,通常可以省略这个部分,因为编译器可以根据返回语句来推断返回类型。
  • {} 内是 lambda 函数的函数体。

例如,一个简单的 lambda 函数可如下定义:

[]() { std::cout << "Hello, Lambda!" << std::endl; 
}

这个例子中的 lambda 函数没有捕获列表,没有参数,没有指定返回类型,函数体只是输出 “Hello, Lambda!”。

这种语法形式使得在代码中方便地定义简短的函数,特别是当这些函数只会在局部使用时。

4.2.1 什么是lambda函数的捕获列表

捕获列表(capture list)指定了 lambda 表达式中可以访问的外部变量的方式。捕获列表位于 lambda 表达式的起始位置,用方括号包围。

捕获列表有以下几种形式:

  • []:不捕获任何外部变量。lambda 表达式只能使用其参数和在其作用域内可见的变量。
  • [x, &y]:按值和按引用捕获变量。通过在方括号中指定变量名,可以选择按值或按引用进行捕获。在方括号中使用逗号分隔不同的捕获方式。

例子:

int x = 1;
int y = 2;
auto func = [x, &y]() { /*...*/ };

在这个例子中,lambda 表达式捕获了变量 x 和 y。x 是按值捕获,因此 lambda 函数会持有 x 的拷贝;y 是按引用捕获,因此 lambda 函数会直接引用变量 y。

使用按值捕获时,lambda 函数会创建外部变量的拷贝,并在其内部使用。而使用按引用捕获时,lambda 函数会直接引用外部变量,因此对外部变量的修改会反映在 lambda 函数中。

捕获外部变量可以让 lambda 表达式更加灵活,并且在使用外部变量时,可以更好地控制其是否可以修改外部变量。

4.3 解法2代码

class Solution {
public:string crackPassword(vector<int>& password) {vector<string> strs;for(auto &ele:password){strs.push_back(to_string(ele));}sort(strs.begin(), strs.end(), [](string &a, string &b){return a+b<b+a;});string ans;for(auto &ele:strs){ans +=ele;}return ans;}
};

这篇关于[LeetCode][LCR164]破解闯关密码——重定义排序规则+贪心的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/886395

相关文章

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快

Oracle登录时忘记用户名或密码该如何解决

《Oracle登录时忘记用户名或密码该如何解决》:本文主要介绍如何在Oracle12c中忘记用户名和密码时找回或重置用户账户信息,文中通过代码介绍的非常详细,对同样遇到这个问题的同学具有一定的参... 目录一、忘记账户:二、忘记密码:三、详细情况情况 1:1.1. 登录到数据库1.2. 查看当前用户信息1.

SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)

《SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)》本文介绍了如何在SpringBoot项目中使用Jasypt对application.yml文件中的敏感信息(如数... 目录SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)前言一、J

MySQL9.0默认路径安装下重置root密码

《MySQL9.0默认路径安装下重置root密码》本文主要介绍了MySQL9.0默认路径安装下重置root密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录问题描述环境描述解决方法正常模式下修改密码报错原因问题描述mysqlChina编程采用默认安装路径,

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

MySQL修改密码的四种实现方式

《MySQL修改密码的四种实现方式》文章主要介绍了如何使用命令行工具修改MySQL密码,包括使用`setpassword`命令和`mysqladmin`命令,此外,还详细描述了忘记密码时的处理方法,包... 目录mysql修改密码四种方式一、set password命令二、使用mysqladmin三、修改u

关于Gateway路由匹配规则解读

《关于Gateway路由匹配规则解读》本文详细介绍了SpringCloudGateway的路由匹配规则,包括基本概念、常用属性、实际应用以及注意事项,路由匹配规则决定了请求如何被转发到目标服务,是Ga... 目录Gateway路由匹配规则一、基本概念二、常用属性三、实际应用四、注意事项总结Gateway路由

Redis 多规则限流和防重复提交方案实现小结

《Redis多规则限流和防重复提交方案实现小结》本文主要介绍了Redis多规则限流和防重复提交方案实现小结,包括使用String结构和Zset结构来记录用户IP的访问次数,具有一定的参考价值,感兴趣... 目录一:使用 String 结构记录固定时间段内某用户 IP 访问某接口的次数二:使用 Zset 进行

电脑密码怎么设置? 一文读懂电脑密码的详细指南

《电脑密码怎么设置?一文读懂电脑密码的详细指南》为了保护个人隐私和数据安全,设置电脑密码显得尤为重要,那么,如何在电脑上设置密码呢?详细请看下文介绍... 设置电脑密码是保护个人隐私、数据安全以及系统安全的重要措施,下面以Windows 11系统为例,跟大家分享一下设置电脑密码的具体办php法。Windo