每日一题之《剑指offer》32,33题

第32题:把数组排成最小的数

难易度:⭐⭐

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个
例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323

对于本题,贪心策略的本质在于比较上,如果贪心策略为:

贪心思路A:
如果有字符串a和字符串b
a < b
那么对于String[] strs = {a,b} 将字符串拼接后的字典序为 a+b

贪心思路A是错误的,因为可以找到反例:

String a = "b"
String b = "ba"
"b" < "ba"
如果对于贪心策略A正确,那么String strs = {"b","ba"} 将字符串拼接后的结果为"bba"
但是我们知道正确 的结果应该为"bab"  

正确的比较部分的贪心策略为:

如果字符串a和字符串b有:
a.concat(b) < b.concat(a)
那么对于String[] strs = {a,b} 将字符串拼接后的字典序为 a+b

因为贪心算法的证明非常繁琐,这里不给予证明,代码如下:

代码如下:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Arrays;

public class Solution {
    public static class MyComparator implements Comparator<String>{
        @Override
        public int compare(String a,String b){
            return (a + b).compareTo(b + a);
        }
    }
    public String PrintMinNumber(int [] numbers) {
        String[] strArr = new String[numbers.length];
        for(int i = 0;i < numbers.length;i++){
            strArr[i] = String.valueOf(numbers[i]);
        }
        Arrays.sort(strArr,new MyComparator());
        String res = "";
        for(int i = 0;i < strArr.length;i++){
            res += strArr[i];
        }
        return res;
    }
}

第33题:丑数

难易度:⭐⭐

题目描述:
把只包含质因子2、3和5的数称作丑数(Ugly Number)
例如6、8都是丑数,但14不是,因为它包含质因子7
习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数

本题的思路是用空间去换时间。

要求出第多少个位置的丑数,就开辟多大的数组空间。因为向丑数数组中新添加的丑数一定是原本丑数数组中某个数字乘以2或者乘以3或者乘以5所得到的。我们使用p2,p3,p5三个指针标记数组当中的位置,通过类似于穷举的方法,它们对应的位置的数分别乘以2,3,5然后依次同丑数数组中顺序添加的最后一个数做比较,如果小于等于数组中最后的一个数,那么就向后移动一个位置。具体的思路可以看代码。
代码如下:

public class Solution {
    public int GetUglyNumber_Solution(int index) {
        if(index <= 0){
            return 0;
        }
        int[] uglyNumberArr = new int[index];
        uglyNumberArr[0] = 1;
        int p2 = 0;
        int p3 = 0;
        int p5 = 0;
        int nextIndex = 1;
        while(nextIndex < index){
            uglyNumberArr[nextIndex] = getMin(uglyNumberArr[p2]*2,uglyNumberArr[p3]*3,uglyNumberArr[p5]*5);
            while(uglyNumberArr[p2]*2 <= uglyNumberArr[nextIndex]){
                p2++;
            }
            while(uglyNumberArr[p3]*3 <= uglyNumberArr[nextIndex]){
                p3++;
            }
            while(uglyNumberArr[p5]*5 <= uglyNumberArr[nextIndex]){
                p5++;
            }
            nextIndex++;
        }
        int res = uglyNumberArr[index - 1];
        uglyNumberArr = null;
        return res;
    }
    public static int getMin(int a,int b,int c){
        int min = a < b ? a : b;
        return min < c ? min : c;    
    }
}
全部评论

相关推荐

02-16 01:39
南昌大学 Java
重剑Ds:感觉不太可能 后端都减飞了 根本不缺人
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
9135次浏览 83人参与
# 你的实习产出是真实的还是包装的? #
1684次浏览 40人参与
# 巨人网络春招 #
11297次浏览 223人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7382次浏览 40人参与
# 重来一次,我还会选择这个专业吗 #
433301次浏览 3926人参与
# 简历第一个项目做什么 #
31500次浏览 327人参与
# MiniMax求职进展汇总 #
23738次浏览 306人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186885次浏览 1118人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152269次浏览 887人参与
# 研究所笔面经互助 #
118851次浏览 577人参与
# 简历中的项目经历要怎么写? #
309944次浏览 4189人参与
# 面试紧张时你会有什么表现? #
30473次浏览 188人参与
# 你今年的平均薪资是多少? #
212980次浏览 1039人参与
# AI时代,哪些岗位最容易被淘汰 #
63328次浏览 799人参与
# 我的求职精神状态 #
447961次浏览 3128人参与
# 你最满意的offer薪资是哪家公司? #
76415次浏览 374人参与
# 高学历就一定能找到好工作吗? #
64294次浏览 620人参与
# 牛客AI文生图 #
21399次浏览 238人参与
# 你怎么看待AI面试 #
179799次浏览 1229人参与
# 正在春招的你,也参与了去年秋招吗? #
363190次浏览 2636人参与
# 腾讯音乐求职进展汇总 #
160562次浏览 1109人参与
# 职能管理面试记录 #
10795次浏览 59人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务