一个面试题

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;

}

原文地址:https://www.cnblogs.com/zhangmaliang/p/6401821.html