2018美团外卖笔试题---[编程题]数字字符

探讨了在有限数量的0-9字符中,找出无法组成的最小正整数的方法。通过统计字符频率并检查1-9字符的存在性,确定该最小数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接:https://www.nowcoder.com/questionTerminal/024c3b99edc34b84999c5830f748a841
来源:牛客网
在十进制表示中,任意一个正整数都可以用字符’0’-‘9’表示出来。但是当’0’-‘9’这些字符每种字符的数量有限时,可能有些正整数就无法表示出来了。比如你有两个‘1’,一个‘2’,那么你能表示出11,12,121等等,但是无法表示出10,122,200等数。 
现在你手上拥有一些字符,它们都是’0’-‘9’的字符。你可以选出其中一些字符然后将它们组合成一个数字,那么你所无法组成的最小的正整数是多少?

输入描述:

第一行包含一个由字符’0’-‘9’组成的字符串,表示你可以使用的字符。
1 ≤字符串长度≤ 1000

输出描述:

输出你所无法组成的最小正整数

示例1

输入

55

输出

1

示例2

输入

123456789

输出

10

解题思路:

无法组成的最小正整数用min来表示

例如:

输入:1230145611

输出:min=7;

输入:11234567895000

输出:min=10000;

注意:0不是正整数。

规律:

1.1-9有一个/多个字符未出现(第一种情况)

min=未出现的最小数

2.1-9所有字符都出现(第二种情况)

min=出现最小次数的值+数字0出现的次数+1;

实现代码:

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#pragma warning(disable : 4996) 
int cheak(char str[], char *a); //检测输入字符串中0-9输入的个数
int main()
{
    char min = 0;
    char numble = 0;
    char str[100] = {'\0'}; //保存输入数据
    char a[10] = {0};   //下标0-9便是字符0-9,a[0]-a[9]的值表示0-9出现的次数
    char i = 0;
    gets(str);  //获取输入字符串
    if (-1 == *str) //检测是否输入非空
    {
        printf("输入错误、\n");
        return 0;
    }
    min = a[1];
    numble = 1;
    if (0==(cheak(str, &a[0])))//检测数字出现次数,返回使用的函数方案)
    {
        for (int i = 1; i < 10; i++) //找到数组a中第一个为0的下标并且输出
        {
            if (0==a[i])
            {
                printf("最小数是:%d\n",a+i-a);
                break;
            }
                
        }
    }
    else //所有字符都出现过所执行的算法
    {
        for (i=1; i < 10; i++) //找出出现次数最多的字符(数组下标表示相应字符,数组值表示)
        {
            
            if (min >a[i] )
            {
                min = a[i];
                numble = i;
            }
        }
        printf("%d",numble);  //输出出现次数最少的字符
        i = a[0] + 1; //输出0个个数为n+1其中n为0出现次数
        for (; i > 0; i--)
            printf("%d",0);
    }
    system("pause");
    return 0;
}

int cheak(char str[],char *a) //检测输入字符串中0-9输入的个数 返回是不是全部字符都有
{
    int count = 0x00;  //0-8位表示数字1-9是否出现,若出现相应位置1
    int i = 1;
    while ('\0' != *str)
    {
        switch (*str)
        {
        case '0': a[0]++;  break;
        case '1': a[1]++, count |=(i<<0); break;
        case '2': a[2]++; count |=(i<<1); break;
        case '3': a[3]++; count |=(i<<2); break;
        case '4': a[4]++; count |=(i<<3); break;
        case '5': a[5]++; count |=(i<<4); break;
        case '6': a[6]++; count |=(i<<5); break;
        case '7': a[7]++; count|= (i<<6); break;
        case '8': a[8]++; count|= (i<<7); break;
        case '9': a[9]++; count |=(i<<8); break;
        default: break;
        }
        str++;
    }
    if ((count & 0x1ff) == 0x1ff)
        return 1;//字符全出现出现
    else
        return 0;//有字符全部出现过
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值