首页 > 其他分享 >LCR 164. 破解闯关密码

LCR 164. 破解闯关密码

时间:2024-12-19 19:31:52浏览次数:3  
标签:LCR String int ++ strs length 164 password 闯关

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

  • 一个拥有密码所有元素的非负整数数组 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,String,int,++,strs,length,164,password,闯关
From: https://www.cnblogs.com/drunkerl/p/18617809

相关文章

  • 题海拾贝:LCR018.验证回文串
               Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路!我的博客:<但凡.我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》欢迎点赞,关注!1、题目2、2、题解         这个题如果没有空格和符号的话,那就直接双指......
  • MBR1645CT-ASEMI肖特基二极管MBR1645CT
    编辑:llMBR1645CT-ASEMI肖特基二极管MBR1645CT型号:MBR1645CT品牌:ASEMI封装:TO-220正向电流:16A反向电压:45V正向压降:0.44V~0.47V引线数量:3芯片个数:2芯片尺寸:MIL漏电流:10ua恢复时间:35ns浪涌电流:200A芯片材质:正向电压:1.10V封装尺寸:如图特性:小家电专用二极管工作结温:-5......
  • c++ 样式错误 “Unknown property transition” /“Could not parse stylesheet of o
    解决办法通过遍历所有的控件,“Unknownpropertytransition打印出所有的控件地址,将地址GPS2>&1log.log输出到log日志中“Couldnotparsestylesheetofobject0xb88164f8”关键函数QStringgetWidgetHierarchy(QObject*widget)获得所有的控件#include<QA......
  • LCR 048. 二叉树的序列化与反序列化(困难)(主站297)
    https://leetcode.cn/problems/h54YBf/https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/难度:☆☆☆题目:序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另......
  • 7-164 试试手气
    我们知道一个骰子有6个面,分别刻了1到6个点。下面给你6个骰子的初始状态,即它们朝上一面的点数,让你一把抓起摇出另一套结果。假设你摇骰子的手段特别精妙,每次摇出的结果都满足以下两个条件:1、每个骰子摇出的点数都跟它之前任何一次出现的点数不同;2、在满足条件1的前......
  • LCR 047. 二叉树剪枝(中等)(主站814)
    https://leetcode.cn/problems/pOCWxh/https://leetcode.cn/problems/binary-tree-pruning/难度:☆☆☆题目:给定一个二叉树根节点root,树的每个节点的值要么是0,要么是1。返回移除了所有不包含1的子树的原二叉树。节点node的子树为node本身,以及所有node的后......
  • LeetCode LCR072[x的平方根]
    题目链接LeetCodeLCR072[x的平方根]详情实例提示题解思路一[暴力法]由于所求的是整型且是正符号整型,可以采取循环遍历的方式来求取平方根用for循环将i由0开始遍历循环体:求i的平方值当平方值小于指定值,此时循环继续退出循环的条件:当平方值为指定值时,返回......
  • LeetCode LCR126[斐波那契数]
    题目链接LeetCodeLCR126[斐波那契数]详情实例提示题解思路首先想到用递归来求解,F(n)=F(n-1)+F(n-2)但是吧,一看提示啊,0<=n<=100,递归执行100次,那肯定是会超时的噻所以单纯递归肯定是不可行的,此处我采用循环代替递归当n=0时,返回0当n=1时,返回1......
  • LCR 043.完全二叉树(中等)(主站919)
    https://leetcode.cn/problems/NaqhDT/https://leetcode.cn/problems/complete-binary-tree-inserter/难度:☆☆☆题目:完全二叉树是每一层(除最后一层外)都是完全填充(即,节点数达到最大,第n层有2n-1个节点)的,并且所有的节点都尽可能地集中在左侧。设计一个用完全二叉树......
  • LCR 042.最近的请求次数(简单)(主站933)
    https://leetcode.cn/problems/H8086Q/https://leetcode.cn/problems/number-of-recent-calls/难度:☆☆题目:写一个RecentCounter类来计算特定时间范围内最近的请求。请实现RecentCounter类:RecentCounter()初始化计数器,请求数为0。intping(intt)在时间t......