[算法题]返回数组A的元素组成的小于n的最大数

最近闲逛论坛,偶然在力扣上看到一个字节面试题。有人记下来发到了论坛里,也许是刚发出来不久,下面回应寥寥。

最近对算法兴趣日增,正好看到这个题,就想把它解决了。

题目如下:
在这里插入图片描述

大概要求就是 数组A中提供了可以使用的1~9的数,给定一个数,求使用A数组中元素能组成的小于给定数值的最大的数。

给定条件A数组的数是升序排列(不是的话,可以做一个排序操作)。

刚开始想了几个解题思路都不太好,后来想到可以先把给定值x转化成digits数组,然后再进行求最大数。这样看起来思路就清晰多了。

这里假定给定值是个32位的正整数。

题解如下:

unsigned int MaxNumberLessThanN(int Numbers[], int Count, unsigned int Value)
{
    int digits[MAX_DECIMAL_DIGIT] = {0};
    int numIdx[MAX_DECIMAL_DIGIT] = {0};
    int idx = 0;
    int i, j;
    int flag = 0;

    if (Numbers == NULL || Count < 0)
    {
        return 0;
    }

    while (Value)
    {
        digits[idx++] = Value % 10;
        Value /= 10;
    }

    for (i = idx - 1; i >= 0; i--)
    {
        for (j = Count - 1; j >= 0; j--)
        {
            if (flag == 1)
            {
                numIdx[i] = j;
                break;
            }
            else if (Numbers[j] == digits[i])
            {
                numIdx[i] = j;
                break;
            }
            else if (Numbers[j] < digits[i])
            {
                numIdx[i] = j;
                flag = 1;
                break;
            }
        }

        if (j == -1)
        {
            if (i == idx - 1)
            {
                numIdx[i] = j;
            }
            else
            {
                numIdx[i + 1]--;
                numIdx[i] = Count - 1;
            }
            flag = 1;
        }
    }

    for (i = 0; i < idx; i++)
    {
        if (i < idx - 1 && numIdx[i] == -1)
        {
            numIdx[i] = Count - 1;
            numIdx[i + 1]--;
        }
    }

    for (i = idx - 1; i >= 0; i--)
    {
        if (numIdx[i] != -1)
        {
            Value = Value * 10 + Numbers[numIdx[i]];
        }
    }

    return Value;
}

为了验证是否正确,写了个测试程序,可以很方便的输入 数字数组和 给定数值。

完整代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_DECIMAL_DIGIT 10

unsigned int MaxNumberLessThanN(int Numbers[], int Count, unsigned int Value)
{
    int digits[MAX_DECIMAL_DIGIT] = {0};
    int numIdx[MAX_DECIMAL_DIGIT] = {0};
    int idx = 0;
    int i, j;
    int flag = 0;

    if (Numbers == NULL || Count < 0)
    {
        return 0;
    }

    while (Value)
    {
        digits[idx++] = Value % 10;
        Value /= 10;
    }

    for (i = idx - 1; i >= 0; i--)
    {
        for (j = Count - 1; j >= 0; j--)
        {
            if (flag == 1)
            {
                numIdx[i] = j;
                break;
            }
            else if (Numbers[j] == digits[i])
            {
                numIdx[i] = j;
                break;
            }
            else if (Numbers[j] < digits[i])
            {
                numIdx[i] = j;
                flag = 1;
                break;
            }
        }

        if (j == -1)
        {
            if (i == idx - 1)
            {
                numIdx[i] = j;
            }
            else
            {
                numIdx[i + 1]--;
                numIdx[i] = Count - 1;
            }
            flag = 1;
        }
    }

    for (i = 0; i < idx; i++)
    {
        if (i < idx - 1 && numIdx[i] == -1)
        {
            numIdx[i] = Count - 1;
            numIdx[i + 1]--;
        }
    }

    for (i = idx - 1; i >= 0; i--)
    {
        if (numIdx[i] != -1)
        {
            Value = Value * 10 + Numbers[numIdx[i]];
        }
    }

    return Value;
}


int main(int argc, char *argv[])
{
    int numbers[10] = {0}, num = 0, count = 0;
    unsigned int value = 0;
    unsigned int retValue = 0;

    printf("please input the digit array[ascend order]:");
    while (scanf("%d", &num) != EOF)
    {
        numbers[count++] = num;

        if (getchar() == '\n' || count == 10)
        {
            break;
        }
    }

    printf("please input the value:");
    scanf("%d", &value);

    retValue = MaxNumberLessThanN(numbers, count, value);

    printf("%d\n", retValue);
    return 0;
}


编译验证结果:

[root@localhost ~]# gcc MaxNumberLessThanN.c 
[root@localhost ~]# ./a.out 
please input the digit array[ascend order]:1 2 4 9
please input the value:2533
2499
[root@localhost ~]# ./a.out 
please input the digit array[ascend order]:4 6 7 8
please input the value:2599
888
[root@localhost ~]# ./a.out 
please input the digit array[ascend order]:3 5 6 8 9
please input the value:5529
5399
[root@localhost ~]# ./a.out 
please input the digit array[ascend order]:2 4 6 8
please input the value:22215
8888
[root@localhost ~]# ./a.out 
please input the digit array[ascend order]:5 7 8 9
please input the value:55554000
9999999

最近突然又喜欢上鼓捣一些算法了,年轻时要这么积极就好了!

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮沉飘摇

码字不易,打赏随意。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值