2019.8.20 bilibili笔试编程题 数字重组

本文介绍了一种通过字典树实现的数字重组算法,用于找出由多个数字连接而成的最小值组合。采用C++14编译器进行实现,避免了C++11的超时问题。文章提供了完整的代码示例,包括字典树的插入和中序遍历过程。

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

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编译器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值