一个面试题
Python:解法
import random
"""
写一个函数输出一个数字中的数字组合的下一个最大组合。例如378的下一个最大的组合是387,71632下一个最大的组合是72136,如果没有更大的组合就返回-1(语言不限)
例子分析:71632
1、从数字后面往前看,如果一直递增则没有更大的组合,返回-1
2、若发现更小的,比如上面1比6小,则从1后面的数字6、3、2中找出比1大的那个最小数为2,然后对剩下的数字1、3、6进行从小到大排序,最终组合为72136
"""
def nextMaxCount(num):# 例子:4565321
if num < 10:
return -1
L = [int(n) for n in str(num)] # L: [4,5,6,5,3,2,1]
for i in range(len(L))[::-1]:
if i == 0:
return -1
if L[i] > L[i-1]:
newL = L[i:] # newL: [6,5,3,2,1]
currentNum = L[i-1]
findNum = -1
for j in range(len(newL))[::-1]:
findNum = newL[j]
if findNum > currentNum:
newL.pop(j) # newL: [5,3,2,1]
newL.append(currentNum)# newL: [5,3,2,1,5]
newL = sorted(newL)# newL: [1,2,3,5,5]
break
targetL = L[:i-1]
targetL.append(findNum)
targetL = targetL + newL
s = ""
for n in targetL:
s = s + str(n)
return s
for i in range(10):
randomNum = random.randint(0,1000000)
nextCout = nextMaxCount(randomNum)
print(str(randomNum) + "--->" + str(nextCout))
OC解法:
// 写一个函数输出一个数字中的数字组合的下一个最大组合。例如378的下一个最大的组合是387,71632下一个最大的组合是72136,如果没有更大的组合就返回-1(语言不限)
/*
例子分析:71632
1、从数字后面往前看,如果一直递增则没有更大的组合,返回-1
2、若发现更小的,比如上面1比6小,则从1后面的数字6、3、2中找出比1大的那个最小数为2,然后对剩下的数字1、3、6进行从小到大排序,最终组合为72136
*/
- (NSUInteger)nextMaxCountWithNum:(NSUInteger)num{ // 例子:4565321
if (num < 10) {
return -1;
}
NSMutableArray *nums = @[].mutableCopy;
while (num) {
[nums insertObject:@(num % 10) atIndex:0];
num /= 10;
}
for (NSInteger i = nums.count - 1; i >= 0; i--) {// nums: [4,5,6,5,3,2,1]
if (i == 0) {
return -1;
}
if (nums[i] > nums[i - 1]) { // i = 2
NSNumber *currentNum = nums[i-1];
NSMutableArray *lastArr = [nums subarrayWithRange:NSMakeRange(i, nums.count - i)].mutableCopy;// lastArr: [6,5,3,2,1]
NSNumber *findNum = 0;
for (NSInteger j = lastArr.count - 1; j >= 0; j--) {
NSNumber *findN = lastArr[j];
if (findN > currentNum) {
findNum = findN; // findNum: 6
[lastArr removeObjectAtIndex:j]; // lastArr: [5,3,2,1]
[lastArr addObject:currentNum]; // lastArr: [5,3,2,1,5]
break;
}
}
[lastArr sortUsingComparator:^NSComparisonResult(NSNumber *obj1, NSNumber *obj2) {// lastArr: [1,2,3,5,5]
return obj1.integerValue > obj2.integerValue;
}];
NSMutableArray *targetArr = @[].mutableCopy;
[targetArr addObjectsFromArray:[nums subarrayWithRange:NSMakeRange(0, i-1)]];// targetArr: [4]
[targetArr addObject:findNum]; // targetArr: [4,6]
[targetArr addObjectsFromArray:lastArr]; // targetArr: [4,6,1,2,3,5,5]
NSString *targetStr = [targetArr componentsJoinedByString:@""];
return targetStr.integerValue;
}
}
return -1;
}