给定一个数字,请编写一个函数,求出绝对值最小的组合。
备注:组合时0不可排在前面。
示例:
输入:312,输出:123
输入:-20,输出:-20
题目难度:中等
题目来源:codewars
def min_permutation(n: int) -> int:
pass
assert min_permutation(312) == 123
assert min_permutation(29394) == 23499
assert min_permutation(-20) == -20
assert min_permutation(0) == 0
fwj
(fwj)
2021 年9 月 15 日 02:33
2
def min_permutation(n:int):
s=str(n)
res=[]
for i in s:
res.append(i)
if n>=0:
res.sort()
return int(''.join(res))
else:
res.sort(reverse=True)
return int('-'+''.join(res[:-1]))
import itertools
def min_permutation(n: int) -> int:
str_n = str(abs(n))
min_res = abs(n)
tmp = itertools.permutations(str_n, len(str_n))
for item in tmp:
num = int("".join(item))
if len(str(num)) == len(str_n):
if n > 0:
min_res = min(min_res, num)
else:
min_res = max(min_res, num)
if n >= 0:
return min_res
return -min_res
def min_permutation_oth(n: int) -> int:
s = str(n)
res = []
tmp = 0
for i in s:
if i == "0":
tmp += 1
elif i.isdigit():
res.append(i)
if n >= 0:
res.sort()
res.insert(1, tmp * "0")
return int(''.join(res))
else:
res.sort(reverse=True)
return int('-' + ''.join(res) + tmp*"0")
if __name__ == "__main__":
assert min_permutation(312) == 123
assert min_permutation(29394) == 23499
assert min_permutation(-29394) == -99432
assert min_permutation(-20) == -20
assert min_permutation(0) == 0
assert min_permutation(2000000) == 2000000
assert min_permutation(2000020) == 2000002
assert min_permutation(-2000000) == -2000000
assert min_permutation_oth(312) == 123
assert min_permutation_oth(29394) == 23499
assert min_permutation_oth(-29394) == -99432
assert min_permutation_oth(-20) == -20
assert min_permutation_oth(0) == 0
assert min_permutation_oth(2000000) == 2000000
assert min_permutation_oth(2000020) == 2000002
assert min_permutation_oth(-2000000) == -2000000
def min_permutation(n: int) -> int:
if n == 0:
return 0
res = [i for i in str(n)]
if n > 0:
res.sort()
# 将所有0移动第一个数字右边
len_a = len(res)
res = [i for i in res if i != '0']
len_b = len(res)
for i in range(len_a-len_b):
res.insert(1, '0')
return int(''.join(res))
else:
res.sort(reverse=True)
return int('-'+''.join(res[:-1]))
assert min_permutation(312) == 123
assert min_permutation(29394) == 23499
assert min_permutation(-20) == -20
assert min_permutation(0) == 0
assert min_permutation(120) == 102
assert min_permutation(-102) == -210
public Integer minPermutation(Integer n) {
if (n > 0) {
String s = String.valueOf(n);
List<Character> collect = s.chars().mapToObj(i -> (char) i).collect(Collectors.toList()).stream().sorted().collect(Collectors.toList());
String collect1 = collect.stream().map(i -> String.valueOf(i)).collect(Collectors.joining("", "", ""));
return Integer.parseInt(collect1);
} else if (n < 0) {
int abs = Math.abs(n);
String s = String.valueOf(abs);
List<Character> collect = s.chars().mapToObj(i -> (char) i).collect(Collectors.toList()).stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
String collect1 = collect.stream().map(i -> String.valueOf(i)).collect(Collectors.joining("", "", ""));
return -Integer.parseInt(collect1);
} else {
return 0;
}
}
@Test
public void testMinPermutation() {
assert minPermutation(312).equals(123);
assert minPermutation(29394).equals(23499);
assert minPermutation(-20).equals(-20);
assert minPermutation(0).equals(0);
}
def min_permutation(n: int) -> int:
nL = list(str(abs(n)))
nL.sort()
count = nL.count('0')
nL = nL[count:]
nL = [nL[0]] + ['0']*count +nL[1:] if nL!=[] else ['0']
if n > 0 :
return int(''.join(nL))
else:
return int('-' + ''.join(nL))
assert min_permutation(312) == 123
assert min_permutation(29394) == 23499
assert min_permutation(-20) == -20
assert min_permutation(0) == 0
def min_permutation(n: int) -> int:
nums = sorted(str(n))
if nums[0] == "-":
result = nums[1:]
result.reverse()
return -int("".join(result))
else:
if nums[0] == "0":
for i in range(len(nums)):
if nums[i] != "0":
nums[i], nums[0] = nums[0], nums[i]
break
return int("".join(nums))
assert min_permutation(312) == 123
assert min_permutation(29394) == 23499
assert min_permutation(-20) == -20
assert min_permutation(0) == 0
def min_permutation(n: int) -> int:
l = list(str(n))
# 按照从小到大排序
l.sort()
data1 = []
data2 = ""
# 如果数字位数为1,返回数字n本身
if len(str(n)) == 1:
return n
# 如果数字位数大于1
else:
# 将除-和0外的数字放入data1列表
for i in l:
if i != '-' and i != '0':
data1.append(i)
# 如果有-,data2第一位为负数
if '-' in l:
data2 += '-'
# 如果有0,data2先放入data1的最小数,然后放入0
if '0' in l:
data2 += data1[0] + '0' * (str(n).count('0'))
# 如果没有0,data2放入data1的最小数
else:
data2 += data1[0]
# 返回data2+data1的第二位开始的数字
return int(data2 + ''.join(data1[1:]))
assert min_permutation(312) == 123
assert min_permutation(29394) == 23499
assert min_permutation(-20) == -20
assert min_permutation(0) == 0