2019.8.20 bilibili笔试编程题 数字重组

1.数字重组

题目描述:

就给出很多个数呗,然后要把这些数随意挨个连在一起,问最终连起来的数最小值是多少

输入:

直接一行,许多个数,用逗号隔开

输出:

输出重组后的数的最小值

样例:

输入:
	32,231
输出:
	23132

思路:

用0~9开字典树,存起来。最后中序输出就好。

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
struct ZDtree
{
    int num;
    int next[10];
    int key;
}node[10010];
int cnt;
char s[10010];
int insert(int i)
{
    int id = 1;
    int key = 0;
    for(;s[i]!=','&&s[i];i++)
    {
        if(node[id].next[s[i]-'0'] == 0)
            node[id].next[s[i]-'0'] = ++cnt;
        id = node[id].next[s[i]-'0'];
        key = key*10+s[i]-'0';
    }
    node[id].num++;
    node[id].key = key;
    return i;
}
int dfs(int id,int from)
{
    for(int i=0;i<10;i++)
    {
        if(i>from)
            if(node[id].num > 0)
            {
                for(int i=1;i<=node[id].num;i++)
                    printf("%d",node[id].key);
                node[id].num = 0;
            }
        if(node[id].next[i]>0)
            dfs(node[id].next[i],i);
    }

}
int main()
{
    scanf("%s",s);
    memset(node,0,sizeof(node));
    cnt = 1;
    for(int i=0;s[i];i++)
        i = insert(i);
  /*  for(int i=1;i<=cnt;i++)
    {
        printf("id=%d num=%d key=%d   ",i,node[i].num,node[i].key);
        for(int j=0;j<10;j++)
            printf("%d ",node[i].next[j]);
        printf("\n");
    }*/
    dfs(1,10);
    printf("\n");
    return 0;
}

考试当天做出来了,AC。但是这题有坑,得用C++14的gcc编译器才能过。C++11超时,什么chang编译器

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值