最近闲逛论坛,偶然在力扣上看到一个字节面试题。有人记下来发到了论坛里,也许是刚发出来不久,下面回应寥寥。
最近对算法兴趣日增,正好看到这个题,就想把它解决了。
题目如下:

大概要求就是 数组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
最近突然又喜欢上鼓捣一些算法了,年轻时要这么积极就好了!
2623

被折叠的 条评论
为什么被折叠?



