2018美團外賣筆試題---[編程題]數字字符

鏈接: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;//有字符全部出現過
}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章