把数组排成最小的数_数组中的逆序对(归并统计法)_数字在升序数组中出现的次数_丑数(剑指offer)

简介: 把数组排成最小的数_数组中的逆序对(归并统计法)_数字在升序数组中出现的次数_丑数(剑指offer)

排序

把数组排成最小的数

题目链接

image.png

import java.util.*;
public class Solution {
    public String PrintMinNumber(int [] numbers) {
        //空数组的情况
        if(numbers == null || numbers.length == 0)
            return "";
        String[] nums = new String[numbers.length];
        //将数字转成字符
        for(int i = 0; i < numbers.length; i++)
            nums[i] = numbers[i]+"";
        //按照重载排序
        Arrays.sort(nums, new Comparator<String>() {
            public int compare(String s1, String s2) {
                return (s1 + s2).compareTo(s2 + s1);
            }
        });
        StringBuilder res = new StringBuilder();
        //字符串叠加
        for(int i = 0; i < nums.length; i++)
            res.append(nums[i]);
        return res.toString();
    }
}

这里题目重点就是自己设计一个排序,通过Comparator接口!

字符串拼接s1 + s21>s2 + s1说明s1和s2位置需要交换!


image.png

相似题目:数据流中的中位数

image.png


读懂题意!


import java.util.*;
public class Solution {
    //将数据流保存在table中!
    private ArrayList<Integer> table = new ArrayList<>();
    public void Insert(Integer num) {
        //在table数据流中插入num值!
        if(table.isEmpty()){
            //直接尾插
            table.add(num);
        }else{
            //不为空,找到合适位置插入!升序排序!
            int i = 0;
            for(i = 0;i< table.size();i++){
                if(table.get(i)>num){
                    //找到了合适位置!
                    table.add(i,num);
                    break;
                }
            }
            if(i==table.size()){
                //尾插!
                table.add(i,num);
            }
        }
    }
    public Double GetMedian() {
        //计算中位数!
        if(table.isEmpty()){
            return 0.0;
        }else{
            int size = table.size();
            if(size%2==0){
                //偶数!
                return (double)(table.get(size/2)+table.get(size/2-1))/2;
            }else{
                //奇数
                return (double)table.get(size/2);
            }
        }
    }
}

插入考虑边界问题!

数组中的逆序对(归并统计法)

题目链接


image.png


image.png


public class Solution {
    private int sum = 0;//保存结果值!
    public int InversePairs(int [] array) {
        //归并统计法!
        //采用归并排序的思想,在毕竟合并时统计逆序对的组数!
        if(array.length<2){
            //无逆序队
            return 0;
        }
        //进行归并统计!
       mergeSort(array,0,array.length-1);
        return sum; 
    }
    public void mergeSort(int[] array,int left,int right){
        //进行先分!
        int mid = left + (right-left)/2;
       if(left<right){
           //左区间!
           mergeSort(array,left,mid);
           //右区间!
           mergeSort(array,mid+1,right);
           //后和并
           merge(array,left,mid,right);
       }
    }
    public void merge(int[] array,int left,int mid,int right){
        //我们进行合并时需要有个临时数组保存
        int[] tmp = new int[right-left+1];
        //记录临时数组开始下标位置!
        int tmpIndex = 0;
        //记录原数组开始下标位置(临时数组数据需要放入到原数组中)
        int arrayIndex = left;
        //左区间开始位置!
        int l = left;
        //右区间开始位置!
        int r = mid+1;
         //进行比较合并!
        while(l<=mid&&r<=right){
           if(array[l]<=array[r]){
               //无逆序,直接将l下标保存在临时数组!
               tmp[tmpIndex++] = array[l++];
           }else{
               //逆序,交换(就将r下标位置保存)
               tmp[tmpIndex++] = array[r++];
               //记录逆序对数!
               //进行归并时,左右数组已经分别有序!
               //l大于r下标元素,也就是l到mid区间都大于r下标元素
               //所以逆序对数为 l下标位置到 r位置个数!
               sum += mid - l +1;
               sum %= 1000000007;
           }
        }
        //区间长度不相等,有剩余值!
        while(l<=mid){
            tmp[tmpIndex++] = array[l++];
        }
        while(r<=right){
            tmp[tmpIndex++] = array[r++];
        }
        //将元素放回到原数组!
        for(int x : tmp){
            array[arrayIndex++] = x;
        }
    }
}

数字在升序数组中出现的次数

题目链接

image.png

public class Solution {
    public int GetNumberOfK(int [] array , int k) {
       //数组以有序!
        //二分查找!
        int l = 0,r = array.length-1; 
        int mid = l + (r-l)/2;
        boolean flg = false;
        while(l<=r){
            mid = l + (r-l)/2;
            if(array[mid]>k){
                //定位在左区间!
                r = mid-1;
            }else if(array[mid]<k){
                //定位在右区间!
                l = mid+1;
            }else{
                //相等!
                //找到!
                flg = true;
                break;
            }
        }
        if(flg){
            for(int i = l;i<=mid;i++){
                if(array[i]==k){
                    //相等区间左边界!
                    l = i;
                    break;
                }
            }
            for(int i = r;i>=mid;i--){
                if(array[i]==k){
                    //相等区间右边界!
                    r = i;
                    break;
                }
            }
            return r - l +1;
        }
        return 0;
    }
}
public class Solution {
    public int GetNumberOfK(int [] array , int k) {
        //直接找到边界,[left,right) 左闭右开!
       return bisearch(array,k+0.5) - bisearch(array,k-0.5);
    }
    public int bisearch(int[] array,double k){
        int left = 0,right = array.length-1;
        while(left<=right){
            int mid = left + (right-left)/2;
            if(array[mid]<k){
                left = mid + 1;
                }else{
               right = mid - 1; 
            }
        }
        //这里二分如果没找到返回的是大于该值的一个下标
        return left;
    }
}

image.png


丑数

链接

image.png

解题思路:


我们先看到题目,把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。


有了上面的定义我们就可以知道,丑数的形式就是2x3y5^z

所以我们可以定义一个数组res,存储第n个丑数。

因为我们要将丑数按从小到大的顺序排序,所以我们就得将对应的丑数放在对应的下标位置,小的放前面。

因为最小的丑数就是1,所以我们初始化res[0]=1,那么接下来的一个丑数是什么呢?我们自己知道是2。

但是我们能不能有一个格式,去将得到接下来的丑数是谁呢?

这个时候上面我们的出来的丑数的格式就起作用了,丑数的形式无非就是这样2x3y5z

所以我们就将res[n]去乘以 2、3、5,然后比较出最小的那个,就是我们当前的下一个丑数了。

image.png

public class Solution {
    public int GetUglyNumber_Solution(int index) {
        if(index==0){
            return 0;
        }
        //利用 丑数: 2^x*3^y*5^z!
        int[] arr = new int[index];//保存前index丑数值!
        arr[0] = 1;
        int i2 = 0,i3 = 0,i5 = 0;//记录2/3/5分别相乘的次数!
        for(int i = 1;i<index;i++){
            //将3个中最小丑数放在前面!
            //每次都是求出最小的丑数!
            arr[i] = Math.min(arr[i2]*2,Math.min(arr[i3]*3,arr[i5]*5));
            if(arr[i]==arr[i2]*2){
                //说明这里的 2 相乘次数加一!
                i2++;
            }
            if(arr[i]==arr[i3]*3){
                //说明这里的 3 相乘次数加一!
                i3++;
            }
            if(arr[i]==arr[i5]*5){
                //说明这里的 5 相乘次数加一!
                i5++;
            }
        }
        return arr[index-1];
    }
}
目录
相关文章
|
网络协议 编译器 C语言
Visual Studio 2022 中解决使用scanf报错的方法(一劳永逸)
宝子们好呀!在上一篇文章中教大家任何安装完成Visual Studio 2022,还没有安装的朋友们可以到这里来看一下呀:Visual Studio 2022下载安装教程 安装完成后,很多新手小白在使用Visual Studio 2022编译器的过程中使用到scanf后会出现报错的情况,也不知道如果改正,所以今天我就来给大家分享解决这个问题的办法。
1067 0
|
人工智能 供应链 安全
实现企业级 MCP 服务统一管理和智能检索的实践。
本文将深入剖析 MCP Server 的五种主流架构模式,并结合 Nacos 服务治理框架,为企业级 MCP 部署提供实用指南。
855 130
|
10月前
|
开发者 API 机器学习/深度学习
淘宝 / 1688 / 义乌购图搜 API 实战指南:接口调用与商业场景应用
本文详解淘宝、1688、义乌购三大平台图片搜索接口的核心特点、调用流程与实战代码。涵盖跨平台对比、参数配置、响应解析及避坑指南,支持URL/Base64上传,返回商品ID、价格、销量等关键信息,助力开发者快速实现商品识别与比价功能。
淘宝 / 1688 / 义乌购图搜 API 实战指南:接口调用与商业场景应用
|
存储 云安全 安全
云概述:云计算简明概述
本文概述了云计算的基本概念、服务模型(IaaS、PaaS、SaaS)、部署模型(私有云、社区云、公共云、混合云)、应用场景(云存储、云桌面、云游戏等)及市场趋势,强调了云计算在推动数字化转型中的重要作用。
1756 60
云概述:云计算简明概述
|
机器学习/深度学习 人工智能 监控
《智破光影迷宫:人工智能图像识别的进阶挑战》
在数字化时代,人工智能图像识别技术广泛应用于安防、医疗、交通等领域,显著提升了工作效率和准确性。然而,复杂背景与光照变化成为其发展的两大挑战。复杂背景使目标识别如大海捞针,光照变化则导致同一对象在不同条件下被误判。为应对这些挑战,深度学习技术如卷积神经网络(CNN)崭露头角,通过自动学习多层次特征提高识别精度。同时,光照归一化技术和数据增强等方法也有效提升了图像识别的鲁棒性。未来,随着算法优化和数据积累,图像识别技术将更加智能精准,为社会带来更多的便利与安全保障。
592 7
|
Oracle Java 关系型数据库
2023年震撼!Java在TIOBE排行榜滑坡至历史最低!
自2023年6月起,Java在TIOBE编程语言排行榜中跌至历史最低的第4位,与C#的差距缩小至1.2%。Java受欢迎程度下降的主要原因是Oracle在Java 8后引入付费许可模式,导致用户流失。尽管如此,Java仍是一门成熟、稳定且跨平台的语言,拥有庞大的用户群和丰富的生态系统。Oracle通过推出Java 17免费版及Java 21的新特性,努力保持其竞争力。未来,Java将继续与其他编程语言竞争并发展。
576 1
|
存储 算法 索引
【查找算法】6种常见的查找算法简述及Python代码实现
【查找算法】6种常见的查找算法简述及Python代码实现
|
机器人 芯片
ChatGPT提问技巧——对话提示
ChatGPT提问技巧——对话提示
1377 8
|
安全 网络安全 数据安全/隐私保护
|
Kubernetes Ubuntu Linux
在Linux中,如何设计和部署容器化应用?
在Linux中,如何设计和部署容器化应用?

热门文章

最新文章