进行位数排序即可,需要区分正数和负数。
给你一个整数 num 。重排 num 中的各位数字,使其值 最小化 且不含 任何 前导零。
返回不含前导零且值最小的重排数字。
注意,重排各位数字后,num 的符号不会改变。
示例 1:
输入:num = 310
输出:103
解释:310 中各位数字的可行排列有:013、031、103、130、301、310 。
不含任何前导零且值最小的重排数字是 103 。
示例 2:
输入:num = -7605
输出:-7650
解释:-7605 中各位数字的部分可行排列为:-7650、-6705、-5076、-0567。
不含任何前导零且值最小的重排数字是 -7650 。
提示:
-1015 <= num <= 1015
-spec smallest_number(Num :: integer()) -> integer().
smallest_number(Num) ->
List = do_list(abs(Num), []),
if
Num =:= 0 ->
0;
Num > 0 ->
{Ans, _Has} = lists:foldl(fun(N, {Min, Has}) ->
if
N =:= 0 ->
{Min*10, Has};
Has =:= 0 ->
{Min*N, 1};
true ->
{Min*10+N, 1}
end
end, {1,0}, List),
Ans;
true ->
Ans = lists:foldl(fun(N, Min) ->
Min*10+N
end, 0, lists:reverse(List)),
-Ans
end.
do_list(0, List) ->
lists:sort(List);
do_list(Num, List) ->
do_list(Num div 10, [Num rem 10 | List]).