LeetCode-重排数字的最小值

算法记录

LeetCode 题目:

  给你一个整数 num 。重排 num 中的各位数字,使其值 最小化 且不含 任何 前导零。

返回不含前导零且值最小的重排数字。


说明

一、题目

输入:num = 310
输出:103
解释:310 中各位数字的可行排列有:013、031、103、130、301、310 。
不含任何前导零且值最小的重排数字是 103 。
复制代码

二、分析

  • 题目没有难度,因为是一个整数的形式不好做处理,所以我们可以将其每一个拆分出来做成一个数组,这样我们就可以方便操作了。
  • 这个题就转换成一个字符组成的最小十进制而且不包含由前导零,那么进行排序就可以了。
  • 如果说源数据大于零,那么就只需要把所有的零移到第一个非零元素的后面组成一个数据即为最小。
  • 如果说源数据小于零,那么直接倒序组成即可。
class Solution {
    public long smallestNumber(long num) {
        boolean flag = num >= 0;
        List<Long> count = new ArrayList();
        int number = 0;
        long ret = 0;
        num = Math.abs(num);
        while(num != 0) {
            count.add(num % 10);
            if(num % 10 == 0) number++;
            num /= 10;
        }
        Collections.sort(count);
        if(flag) {
            for(int i = number; i < count.size(); i++) {
                if(i == number) {
                    ret = count.get(i);
                    while(number > 0) {
                        ret *= 10;
                        number--;
                    }
                } else {
                    ret *= 10;
                    ret += count.get(i);
                }
            }
        } else {
            for(int i = count.size() - 1; i >= 0; i--) {
                ret *= 10;
                ret += count.get(i);
            }
        }
        return flag ? ret : -ret;
    }
}
复制代码

总结

对数字的拆分处理。

猜你喜欢

转载自juejin.im/post/7107194344083292174